2014-11-28 17 views
11

Ich weiß, dass es möglich ist, flache Submodule mit der --depth Option mit git submodule update zu haben.Flacher Klon mit Submodulen in Git, wie spitz zu verwenden und nicht die neuesten?

jedoch Wenn ich

git submodule update --init --recursive --depth 1 

auf mein Projekt mit mehreren Submodule laufen lasse, erhalte ich eine fatal: reference is not a tree. Also habe ich versucht, wieder mit

git submodule update --init --recursive --depth 100 

die korrekt gearbeitet, jedoch würde Ich mag Tiefe zu halten, bei 1.

Es scheint mir, dass --depth 1 zieht die letzte im Submodul begehen, nicht die commit Auf das Haupt-Repository verwiesen, und deshalb hat das Setzen von 100 das Problem gelöst, da es eine längere Liste von Commits, einschließlich der spitzen, gezogen hat.

Leider, wenn das der Fall ist, dann kann ich nicht im Allgemeinen sicher sein, dass die letzten 100 commits dasjenige einschließen, das ich brauche.

Wie sage ich Git, die spitzen Zusagen und nicht die neuesten im flachen Klon mit Submodulen zu verwenden?

Ich benutze git 1.9.4 unter Windows.

+0

Siehe auch 'git config -f .gitmodules Submodul. .halse wahr "mit http://stackoverflow.com/a/38895397/6309 – VonC

Antwort

7

Leider scheint es keine Möglichkeit zu geben, eine git fetch mit nur einer bestimmten Commit-ID zu machen. Wenn es da ist, würde ich es wirklich wissen wollen. Allerdings habe ich Ihr Problem auf zwei verschiedene Arten gelöst: Erstens, wenn es möglich ist, erstellen Sie ein Tag oder eine Verzweigung auf dem Remote-Repository, die auf das Commit verweist, das ich möchte, sagen wir nennen es "Ref". Auf diese Weise kann ich die Fernreferenz holen und die --depth wird darauf angewendet, nicht der neueste Tipp. Statt git submodule update --init ich tun:

git submodule init 
git clone --depth 1 -b ref --separate-git-dir .git/modules/sub/ repository sub 

wo „sub“ ist der Name und Pfad des Submodul (der Einfachheit halber wollen wir sagen, dass sie gleich sind)

Der andere Weg, wenn Sie keine Tags erstellen oder Niederlassungen in der Remote-Repository ist für den Commit Sie in einer Schleife suchen mögen:

git submodule init 
id=$(git submodule status|sed -ne 's/.\([a-z0-9]*\) sub.*/\1/p' 
git clone --depth 1 --separate-git-dir -n .git/modules/sub/ repository sub  
cd sub 
while ! git rev-list $id ; do 
    git fetch --depth $((i+=1)) 
done 
git checkout $id 

Sie mit mehr erhöhen könnten als nur einen nach dem anderen begehen, um es schneller zu gehen, aber Sie könnten am Ende mit einige frühere Commits als die, die Sie wollen.

+0

Hey. Danke für den Tipp, sieht aus, als wäre es nah an dem, wonach ich suche. Weißt du, ob es möglich ist, ein bestimmtes Tag aus der Ferne zu klonen, während der Klon so flach wie möglich gehalten wird? Funktioniert die --depth 1 mit dem Tag ref? –

+0

Entschuldigung für eine sehr späte Antwort, ich erinnere mich, dass die Antwort auf Ihre Frage ja war, aber ich kann es jetzt nicht noch einmal testen. nur aus Neugier, hast du es versucht, und hat es funktioniert, wie du es wolltest? – kouk

+0

Ja, ich habe es versucht, und es hat irgendwie funktioniert. Ich entschied mich jedoch für einen anderen Projektaufbau und vermied es jetzt, Submodule zu verwenden. –