2013-04-17 3 views
14

Я использую TortoiseGit для хранения git-хранилища. У нас есть одно репо с несколькими подмодулями в каждом. Все работает нормально, но когда я пытаюсь вытащить основное репо, подмодули не обновляются. Я должен вытаскивать каждый подмодуль один за другим.Подтягивание git-подмодулей с TortoiseGit

Есть ли возможность в черепахе использовать только одну команду вытаскивания из меню, чтобы обновить все изменения во всех подмодулях для репо?

+1

Вы спрашиваете об автоматическом «обновлении» или автоматическом «вытягивании» подмодулей? – fantastory

ответ

2

Update

Существует в настоящее время способ сделать это в TortoiseGit, которая покрывает другой ответ; старый сценарий, который может быть полезен для сценариев автоматизации ниже.

Старый Редактировать

Там в настоящее время нет способа сделать это в TortoiseGit, хотя я нашел автор очень отзывчив на хорошие идеи, если вы представить их как четкие пожелания. Вот как я справиться с этой проблемой:

В каждом новом проекте с подмодулями, я свалка следующих 2 скрипта в корень:

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 

или если вы предпочитаете забирать HEAD на своих подмодулях, а не фиксацию родительского репо, с помощью:

gitpullallhead.sh:

git submodule foreach git pull origin master 

Вот что они делают:

Когда кто-то тянет ваш проект вниз через TortoiseGit, они будут иметь хуже, чем необходимости тянуть все подмодули - они не будут даже настроены эти подмодули. Хуже того, если они попытались настроить их:

  1. TortoiseGit только собирается встать на пути - на самом деле у него нет ничего, чтобы справиться с этой проблемой.
  2. Они будут использовать командную строку, которая будет указывать каждый подмодуль на своем репо, но не связывать его с вашим ключом Tortoise/PuTTY, как обычный Pull.

Так что, если они просто запустить gitsetup.sh, он берет на себя все, что - он устанавливает каждый подмодуль, тянет его, и даже вставляет специальный .ppk (ключ PuTTY) конфигурации установки в каждом из них. Работает в любом проекте - нет необходимости настраивать его каждый раз.

gitpullall.sh делает только то, что вы думаете, оно идет и извлекает все.

Итак, не строго решение TortoiseGit (которого не существует), но все же достаточно удобно.

Как видно из комментариев в этих сценариях, я не профессионал Bash и явно взломал их вместе. Я приветствую предложения по улучшению, особенно в самых очевидных местах. Но я заверяю вас, что они не только работают, но и работают над несколькими нашими проектами с множеством подмодулей, хранящихся на нескольких уровнях каталогов.

Старый ответ:

Что-то вроде:

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

Этот ответ верный для git shell/CMD - но я считаю, что OP задал вопрос конкретно в Tortoise (что мне также было бы интересно) –

22

(мерзавец 1.8.2 или более поздней версии)

  1. мерзавец тянуть

  2. GIT --merge обновления подмодуль - -remote

Ниже перечислены соответствующие экраны TortoiseGit для выполнения задачи.

enter image description here

enter image description here

enter image description here

+0

Да, это получилось красиво. Благодарю. – Snoopy

+0

для моей собственной ссылки, фиксации, игнорирования, нажатия –

1

Я также был в состоянии просто щелкнуть правой кнопкой мыши на папке, которая была подмодуль и сделать нормальный Git Потянуть на эту папку.

Это вытащил только подмодуль - настолько немного проще, чем (по общему признанию, большой) ответ выше для одного подмодуля.

Смежные вопросы