自動的にgit submodule update
(またはできれgit submodule update --init
ばいつでも呼び出せるように)する方法はありgit pull
ますか?
git config設定、またはこれに役立つgitエイリアスを探しています。
自動的にgit submodule update
(またはできれgit submodule update --init
ばいつでも呼び出せるように)する方法はありgit pull
ますか?
git config設定、またはこれに役立つgitエイリアスを探しています。
回答:
のとしてGitの2.14は、使用することができますgit pull --recurse-submodules
(何でもあなたのようにそれをしてエイリアス)。
以下のようにGit 2.15、あなたが設定することができsubmodule.recurse
、目的の動作を有効にするには、trueに。
これをグローバルに行うには、次のコマンドを実行します。
git config --global submodule.recurse true
git pull
、サブモジュールもフェッチされて実行されsubmodule update
ます。これは本当に受け入れられる答えである必要があります
git config --global submodule.recurse true
git clone
も同様にそれを有効にする必要があります。デフォルトでオンにします。それ以外の場合、人々のモジュールは常に同期しなくなるため、サブモジュールの使用には常に大きな抵抗があります:-(
commit
、fetch
、pull
、等)のみが現在のリポジトリに適用されるように設計されています。サブモジュールは別のリポジトリであり、デフォルトで親リポジトリで実行されるコマンドの影響を受けません。これはgit-developerによる一種の設計決定です。
git config --global alias.pullall '!git pull && git submodule update --init --recursive'
引数をgit pullに渡したい場合は、代わりにこれを使用します。
git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'
Git 1.7.5以降、デフォルトでサブモジュールを自動的に更新するようになっています。
[EDITは:コメントごと:新しい1.7.5動作が自動的にすることですフェッチサブモジュールの最新のコミットをしますが、ないために更新し、それら(でgit submodule update
感覚を)。したがって、この回答の情報は背景として関連していますが、それだけでは完全な回答ではありません。1つのコマンドでサブモジュールをプルおよび更新するには、エイリアスが必要です。]
「オンデマンド」のデフォルトの動作は、サブモジュールのコミットを更新するコミットをフェッチするたびにサブモジュールを更新することであり、このコミットはローカルクローンにまだ配置されていません。
また、フェッチごとに更新することもしないこともできます(1.7.5より前の動作と思います)。
この動作を変更する設定オプションはfetch.recurseSubmodules
です。
このオプションは、ブール値またはに設定できます
on-demand
。
ブール値に設定するとの動作変更fetch
とpull
セット真または偽のすべてのセット時に再帰的ではないにサブモジュールに無条件再帰にします。
on-demand
(デフォルト値)に設定するfetch
とpull
、スーパープロジェクトがサブモジュールの参照を更新するコミットを取得したときにのみ、入力されたサブモジュールに再帰します。
見る:
詳細については。
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
ではなく単にを実行しgit submodule update
ます。
git pull
ではなく、で使用した場合でもgit fetch
、このオプションはフェッチを再帰的にするだけです。サブモジュールでチェックアウトされるコミットはまったく変更されません。git submodule update
@Artemによって指摘されているように、それはまだ必要です。
誰もがこれを行うためにgitフックを使用することに言及していないことに驚きます!
ただ、名前のファイルを追加post-checkout
し、post-merge
あなたに.git/hooks
それらのそれぞれに関連するリポジトリのディレクトリ、および以下を置きます:
#!/bin/sh
git submodule update --init --recursive
エイリアスを具体的に要求したので、これを多くのリポジトリで使用したい場合、これらをリポジトリに追加するエイリアスを作成でき.git/hooks
ます。
git pull --rebase
(
サブモジュールの更新を自動的に処理するgitコマンドのエイリアスを作成できます。以下を.bashrcに追加してください
# make git submodules usable
# This overwrites the 'git' command with modifications where necessary, and
# calls the original otherwise
git() {
if [[ $@ == clone* ]]; then
gitargs=$(echo "$@" | cut -c6-)
command git clone --recursive $gitargs
elif [[ $@ == pull* ]]; then
command git "$@" && git submodule update --init --recursive
elif [[ $@ == checkout* ]]; then
command git "$@" && git submodule update --init --recursive
else
command git "$@"
fi
}
サブモジュールとネストされたサブモジュールを更新する唯一の方法:
git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;
角かっこが原因で、ターミナルからエイリアスを作成するのに苦労していたため、グローバルの.gitconfigに手動で追加する必要がありました。
[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"
コマンドまたはエイリアスを自動的に実行する方法について何か提案はありますか?