2013-04-17 7 views
14

Ich verwende TortoiseGit, um das Git-Repository zu verwalten. Wir haben ein Repo mit mehreren Submodulen in jedem. Alles funktioniert gut, aber wenn ich versuche, Hauptrepo zu ziehen, werden Submodule nicht aktualisiert. Ich muss jedes Submodul eins nach dem anderen ziehen.Ziehen von Git-Submodulen mit TortoiseGit

Gibt es eine Option in Tortoise, um nur einen Pull-Befehl aus dem Menü zu verwenden, um alle Änderungen in allen Submodulen für Repo zu aktualisieren?

+1

Fragen Sie nach automatischen 'Aktualisieren' oder automatischen 'Ziehen' von Submodulen? – fantastory

Antwort

2

aktualisieren

Es gibt jetzt eine Möglichkeit, dies in TortoiseGit zu tun, die die andere Antwort abdeckt; alter Skriptansatz, der für Automatisierungsskripte unten nützlich sein kann.

Old bearbeitet

Es gibt keine aktuelle Art und Weise ist dies in TortoiseGit zu tun, obwohl ich den Autor gefunden habe gute Ideen sehr anspricht, wenn man sich als klares Feature Requests einreichen. Hier ist, wie ich mit diesem Problem fertig werden:

In jedem neuen Projekt mit Submodule, ich Dump die folgenden zwei Skripte in die root:

gitsetup.sh

#!/bin/bash 
# git built-in 
echo "Setting up submodules" 
git submodule update --init 

echo "Setting up submodules for TortoiseGit/Putty" 
# 1) Find the puttykeyfile line, like 
#   puttykeyfile = C:\\Users...\\.ssh\\PuTTY.ppk 
# 
# in .git/config 

# pass to sed to double-escape all backslashes (Windows problem) - that way 
# it doesn't become an issue when we use it in sed 
puttyline="$(grep puttykeyfile .git/config | sed 's/\\/\\\\/g')" 

# 2) Search for .git/modules/*/config 

files=$(find .git/modules -type f -name config) 

# 3) Find [remote "origin"] 
# 4) Insert line (entire puttykeyfile line we picked up earlier) 

echo 'Inserting missing TortoiseGit .ppk into submodules:' 

for file in $files 
do 
    # -q says don't print the grep results, just return 0 or 1 
    if grep -q putty $file 
    then 
     # I have no idea how to just say if not grep, so screw it here's an empty then 
     /dev/null 
    else 
     echo $file 
     # -i means overwrite the file rather than printing the result to 
     # stdout 
     sed -i "s/\(\[remote .origin.\]\)/\1\n$puttyline/" $file 
    fi 
done 

gitpullall.sh

#!/bin/bash -v 
git pull --recurse-submodules 
git submodule update --recursive 

oder wenn Sie lieber HEAD auf Ihre Submodule holen, nicht das Commit der Eltern Repo wurde eingecheckt mit:

gitpullallhead.sh:

git submodule foreach git pull origin master 

Hier ist, was sie tun:

Wenn jemand anderes Projekt zieht über TortoiseGit nach unten, wird sie schlimmer als alle Submodule zu ziehen, um - sie werden nicht sogar diese Submodule konfiguriert haben. Schlimmer, wenn sie versuchten, sie einzurichten:

  1. TortoiseGit wird nur in die Quere kommen - es hat noch nicht wirklich etwas mit diesem Problem zu bewältigen.
  2. Sie verwenden die Befehlszeile, die jedes Submodul auf seinen Repo zeigt, aber es nicht mit Ihrem Tortoise/PuTTY-Schlüssel verknüpft, wie es ein normaler Pull tun würde.

Also, wenn sie nur gitsetup.sh laufen, sorgt er dafür, all das - es setzt jedes Submodul auf, zieht es und sogar fügt die speziellen .ppk (PuTTY key) Config in jeder Einstellung. Funktioniert in jedem Projekt - keine Notwendigkeit, es jedes Mal zu optimieren.

gitpullall.sh macht genau das, was Sie denken, es geht und holt alles.

Also, nicht unbedingt eine TortoiseGit-Lösung (die es nicht gibt), aber immer noch bequem genug.

Wie wahrscheinlich durch die Kommentare in diesen Skripten belegt wird, bin ich kein Bash-Profi und habe sie eindeutig zusammengehackt. Ich begrüße Verbesserungsvorschläge, besonders an den offensichtlichsten Orten. Aber ich versichere Ihnen, dass sie nicht nur arbeiten, sondern über mehrere unserer Projekte mit zahlreichen Submodulen arbeiten, die auf verschiedenen Verzeichnisebenen gespeichert sind.

Alte Antwort:

Etwas wie:

for module in a b c d; do cd $module; git pull; cd..; done 
+0

Diese Antwort ist korrekt für Git Shell/CMD - aber ich glaube, dass das OP speziell in Tortoise gefragt hat (was mich auch interessieren würde) –

22

(git 1.8.2 oder höher)

  1. git ziehen

  2. git Submodul Update --merge - -Fernbedienung

Hier sind die entsprechenden Bildschirme von TortoiseGit, um die Aufgabe zu erfüllen.

enter image description here

enter image description here

enter image description here

+0

Ja, das hat gut funktioniert. Vielen Dank. – Snoopy

+0

für meine eigene Referenz, commit, ignore, push –

1

war ich auch in der Lage, sich nur auf den Ordner der rechten Maustaste, die das Submodul war und tun auf diesem Ordner ziehen ein normales Git.

Dies zog nur das Submodul - so etwas einfacher als die (zugegebenermaßen große) Antwort oben für ein einzelnes Submodul.