2013-04-17 69 views
14

私はgitリポジトリを維持するためにTortoiseGitを使用しています。私たちは、それぞれに複数のサブモジュールを持つ1つのレポを持っています。すべて正常に動作しますが、メインリポジトリを取得しようとすると、サブモジュールは更新されません。私はすべてのサブモジュールを一つずつ引っ張っていかなければなりません。TortoiseGitでgitサブモジュールを引き出す

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

+1

オートアップデートや自動引き上げサブモジュールについて聞かれますか? – fantastory

答えて

2

更新

他の答えがカバーTortoiseGit、でこれを行う方法が用意されました。以下の自動化スクリプトに役立つ古いスクリプトアプローチ。

旧編集

私はあなたが明確な機能のリクエストとしてそれらを送信する場合、著者は良いアイデアに非常に敏感であることがわかりましたが、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'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 
:サブモジュールを持つすべての新しいプロジェクトでは

、私はルートに次の2つのスクリプトをダンプ

、またはサブモジュールでHEADを取得したい場合は、コミットではなく、親レポがチェックインされている:

gitpullallhead.sh:

git submodule foreach git pull origin master 

はここで、彼らが何をすべきかです:他の誰かがTortoiseGitを経由して、プロジェクトをプルダウンすると

は、彼らがすべてのサブモジュールを引っ張っする必要がより悪化しなければならないだろう - 彼らはしませんそれらのサブモジュールを構成することさえできます。さらに悪いことに、それらを設定しようとした場合:

  1. TortoiseGitはちょうどこの問題に対処するためのものではありません。
  2. 彼らは、それぞれのサブモジュールがそのリポジトリを指し示すが、通常のPullのようにあなたのTortoise/PuTTYキーと関連付けることはないコマンドラインを使用します。

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

(gitの1.8.2以降)

  1. gitが

  2. gitのサブモジュールの更新--mergeを引っ張ります - -remote

タスクを実行するためのTortoiseGitの対応画面を以下に示します。

enter image description here

enter image description here

enter image description here

+0

はい、うまくいきました。ありがとう。 – Snoopy

+0

私自身の参照、コミット、無視、プッシュ –

1

私もちょうどサブモジュールだったフォルダを右クリックして、そのフォルダに通常のGitのプルを行うことができました。

これはサブモジュールを引っ張ってしまったので、上記の(単なるサブミットの)答えよりもやや簡単です。

関連する問題