18

TortoiseGit を使用して git リポジトリを維持しています。それぞれに複数のサブモジュールを持つ 1 つのレポがあります。すべて正常に動作しますが、メイン リポジトリをプルしようとすると、サブモジュールが更新されません。すべてのサブモジュールを 1 つずつプルする必要があります。

メニューからプルコマンドを1つだけ使用して、レポのすべてのサブモジュールのすべての変更を更新するオプションは亀にありますか?

4

3 に答える 3

2

また、サブモジュールであるフォルダーを右クリックして、そのフォルダーに対して通常の Git Pull を実行することもできました。

これにより、サブモジュールのみがプルされました。単一のサブモジュールに対する上記の(確かに素晴らしい)回答よりもわずかに単純です。

于 2015-08-17T13:31:56.243 に答える
2

アップデート

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 キーに関連付けません。

そのため、gitsetup.sh を実行するだけで、すべての処理が行われます。各サブモジュールがセットアップされ、プルされ、特別な .ppk (PuTTY キー) 構成設定が各サブモジュールに挿入されます。どのプロジェクトでも機能します - 毎回微調整する必要はありません。

gitpullall.sh はあなたが思っていることを実行し、すべてをフェッチします。

したがって、厳密には TortoiseGit ソリューション (存在しない) ではありませんが、それでも十分に便利です。

これらのスクリプトのコメントからも明らかなように、私は Bash の専門家ではなく、それらを一緒にハッキングしたことは明らかです。特に最も明白な場所での改善のための提案を歓迎します。しかし、それらは機能するだけでなく、複数のディレクトリ レベルに多数のサブモジュールが格納されている複数のプロジェクトで機能することを保証します。

古い答え:

何かのようなもの:

for module in a b c d; do cd $module; git pull; cd..; done
于 2013-05-15T01:35:48.783 に答える