Git-Tag für einen Unterordner eines Repositorys

8

Ich benutze Git, um ein SVN-Repository zu importieren. Dann habe ich mein eigenes Projekt als Unterordner im Repository angelegt.

Ich benutze das SVN-Repository mit Git-SVN. Mein Arbeitsverfahren ist:

  1. git commit -am "message"
  2. git svn rebase
  3. git svn dcommit .

Jetzt möchte ich mein Projekt mit git tag -a RC1 -m 'Release Candidate 1' versehen, aber ich möchte nur, dass mein Projekt das Tag bekommt.

Wie kann ich das tun?

    
BuZZ-dEE 09.10.2012, 09:20
quelle

4 Antworten

8

TL; DR-Version

Es ist möglich, bestimmte Verzeichnisse (aka Bäume) zu markieren, wenn Sie den SHA-1 des Baumes kennen, aber es wird nicht oft gemacht & amp; nicht einfach, nützliche Dinge mit diesem Tag zu tun.

Lange Antwort

Jedes Objekt in Git hat eine einzigartige SHA-1. Am häufigsten beziehen sich SHA-1 auf Commits, aber sie können sich auch auf Blobs (Dateiinhalte) und Trees (Verzeichnisstrukturen & amp; Dateinamen / Datei-Erlaubnis-Mappings) beziehen. Sie können darüber in der Git Objects-Dokumentation nachlesen.

Angenommen, ich bin in einem bestimmten Verzeichnis in meinem Repository. Ich kann git ls-tree HEAD ausführen, um die Liste der Dateien / Verzeichnisse in meinem Pfad zusammen mit ihren SHA-1s zu erhalten:

%Vor%

Ich kann dann einen dieser Bäume markieren (sagen wir oben das data -Verzeichnis):

%Vor%

Das Tag ist jetzt ein Alias ​​für dieses SHA-1 und ich kann es verwenden, wo immer ein SHA-1 für einen Baum akzeptiert wird:

%Vor%

Um das Original SHA-1 zurückzubekommen:

%Vor%

Was nützt dir das alles? Nicht viel wie-ist. Wenn Sie jedoch bereit sind, eigene Skripts zu schreiben, um den Inhalt eines Baumes zu rekonstruieren oder um die Commits zu finden, die einen Baum enthalten, könnte es für Sie nützlich sein. (z. B. diese SO-Antwort könnte für einen solchen Zweck angepasst werden).

Aber wie andere bereits gesagt haben, wird es Ihnen wahrscheinlich leichter fallen, ein Versions- / Tagging-Modell zu verwenden, das besser mit Git funktioniert, als zu versuchen, Ihr vorhandenes Modell anzupassen. Wie bereits von shikjohari & amp; andere, wenn Sie Projekte innerhalb eines Projekts haben möchten, die ihre eigenen Versionen haben, betrachten Sie Git Submodule statt.

    
tavnab 29.07.2015 21:45
quelle
6

Sie können nicht.

In Git gilt ein Tag by Design immer für das gesamte Repository (genau wie Commits und Branches). Dies ist anders als in Subversion, wo ein Tag (nur eine Kopie) auf einen Teilbaum angewendet werden kann.

Übrigens: Das Markieren eines Unterbaums wird normalerweise auch in Subversion nicht empfohlen, da es schnell verwirrend werden kann, welcher Teil des Baumes markiert wurde. Die meisten Quellen, die ich kenne (z. B. Version Kontrolle mit Subversion empfehlen, immer zu markieren, indem Sie trunk kopieren.

Über dein Problem:

Normalerweise sollten separate Projekte separate Git-Repositories erhalten. "Getrennt" bedeutet in diesem Zusammenhang normalerweise, dass Sie eine separate Verzweigung / Markierung erstellen möchten.

Wenn Sie dies nicht tun / können, ist es wahrscheinlich die beste Option, ein Tag-Präfix zu verwenden und alle Tags myproj-1.0 , myproj-1.1 etc.

aufzurufen     
sleske 09.10.2012 12:48
quelle
3

Dies ist mit Git nicht möglich. Ein Git-Tag ist ein Zeiger auf ein bestimmtes Commit, während ein Subversion-Tag eine Kopie eines beliebigen Ordners im Subversion-Repository ist. Das Konzept, einen einzelnen Ordner in Subversion zu markieren, wird in Git nicht gut umgesetzt.

Das Problem besteht darin, dass Ihre ursprüngliche Konfiguration nicht mit dem Verzweigungsmodell von Git übereinstimmt. Der Weg, dies in einer git-freundlichen Weise zu tun, wäre, eine Verzweigung für Ihr Projekt einzurichten und dann Commits für diesen Zweig zu taggen.

Sie haben ein paar Optionen:

  • Markieren Sie das gesamte Repository zu einem bestimmten Zeitpunkt mit git svn tag . Führen Sie git help svn für Anweisungen zur Verwendung dieses Befehls aus.

  • Markieren Sie das Verzeichnis mit regulären Subversion-Befehlen. Dies erfordert nicht das Herunterladen einer Subversion-Arbeitskopie, da Sie einfach svn copy {URL to your project on the repository} {URL to your tag directory} ausführen können, aber Sie müssen Subversion installieren.

  • Starten Sie einen neuen Git-Klon Ihres Subversion-Repositorys in einem ganz neuen Verzeichnis. Geben Sie Ihren Projektordner als Trunk-URL statt der eigentlichen Trunk an. Git-svn wird dieses Verzeichnis dann als Hauptzweig behandeln und Ihnen erlauben, es durch Subversion zu markieren und zu kopieren.

me_and 09.10.2012 12:51
quelle
1

Ich befand mich in einem ähnlichen Problem, als ich ein sehr großes Projekt nach Git verlegen musste. Ich stellte fest, dass das Team das SVN nicht richtig gehandhabt hat und die Markierungen von wo auch immer sie wollten. Also gab es Tags für einzelne Projekte und Ordner - was sehr zu empfehlen ist.

Wenn du vorhast, nach Git zu ziehen, solltest du es so halten, wie es in Git funktioniert und es sauber halten. Ich würde vorschlagen, separate Repositories für häufig wechselnde Projekte zu erstellen. Sie können auch Submodule verwenden, wenn Sie Ihr Projekt von anderen Projekten abhängig machen.

    
shikjohari 09.01.2015 08:15
quelle

Tags und Links