Вытягивание подмодулей git с TortoiseGit - программирование
Подтвердить что ты не робот

Вытягивание подмодулей git с TortoiseGit

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

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

4b9b3361

Ответ 1

(git 1.8.2 или новее)

  • git pull

  • git обновление подмодуля --merge --remote

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

enter image description here

enter image description here

enter image description here

Ответ 2

Update

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

Старый редактор

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

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

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 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, у них будет хуже, чем нужно, чтобы вытащить все подмодули - у них даже не будут настроены эти подмодули. Хуже того, если они попытались настроить их:

  • TortoiseGit просто будет мешать - на самом деле у него нет ничего, чтобы справиться с этой проблемой.
  • Они будут использовать командную строку, которая укажет каждый подмодуль на свое репо, но не свяжет его с вашим ключом 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

Ответ 3

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

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