これを横切って起こっている他の誰かのためのいくつかのメモ!
ルーキーが犯そうとしている最大の間違いは、サブモジュールの更新を行った後、サブモジュールでHEADを切り離してコミットすることです。フックからの強い警告でこれに対抗しようと思います。
次に大きいのは、サブモジュールを必要とするチェックアウトを実行した後、サブモジュールの更新を実行できないことです。繰り返しますが、フックはこれをチェックして警告することができます。
開発プロセスに関しては、このセットアップにより、サブモジュールに優れたテストインフラストラクチャを用意することがはるかに重要になります。これにより、可能であれば、親で作業することなくサブモジュールで作業でき、問題を完全に回避できます。
最終的に使用するフックからサンプルコードを投稿し、1か月後に(多すぎないことを願って)本当のホラーストーリーをフォローアップします。
編集:
これがフックの最初のドラフトです。これは急いでいる仕事であることを忘れないでください、そして私に気楽に行ってください!
親リポジトリ:
マージ後およびチェックアウト後、サブモジュールが同期していない場合はユーザーに警告します。(ポストマージは、特に早送りマージ、オリジンからのプルに含まれています)また、サブモジュールのポストチェックアウトフックもサブモジュール更新を実行するときにそれを行いますが、ブランチをチェックアウトする必要があることに注意してください。より多くのリマインダーが楽しい。
#!/bin/bash
if git submodule status | grep '^+' > /dev/null; then
echo "WARNING: common model submodule now out of sync. You probably want to run" 1>&2
echo " git submodule update, then make sure to check out an appropriate branch" 1>&2
echo " in the submodule." 1>&2
fi
コミット後の場合、サブモジュールの変更がある場合は、コミットに含めるのを忘れている可能性があることをユーザーに警告します。この高度に結合されたケースでは、これは非常に良い推測です。ユーザーがシミュレーションモデルと一般モデルを別々に変更する可能性はほとんどありません。
#!/bin/bash
if git submodule status | grep '^+' > /dev/null; then
echo "WARNING: common model submodule has changes. If the commit you just made depends" 1>&2
echo " on those changes, you must run git add on the submodule, and then run" 1>&2
echo " git commit --amend to fix your commit." 1>&2
fi
また、サブモジュールでは、チェックアウト後のフックを使用して、HEADが切り離されていることを強く警告します。
#!/bin/bash
get_ppid() {
ps --no-headers -o ppid $1
}
# Check to see if this checkout is part of a submodule update
# git submodule calls git checkout, which calls this script, so we need to
# check the grandparent process.
if ps --no-headers -o command $(get_ppid $(get_ppid $$)) | grep 'submodule update' &> /dev/null; then
if ! git symbolic-ref HEAD &> /dev/null; then
echo "WARNING: common model submodule entering detached HEAD state. If you don't know" 1>&2
echo " what this means, and you just ran 'git submodule update', you probably" 1>&2
echo " want to check out an appropriate branch in the submodule repository." 1>&2
echo
# escape the asterisk from SO's syntax highlighting (it sees C comments)
branches=($(git for-each-ref --format='%(objectname) %(refname:short)' refs/heads/\* | grep ^$(git rev-parse HEAD) | cut -d\ -f2))
case ${#branches} in
0 )
;;
1 )
echo "Branch '${branches[0]}' is at HEAD"
;;
* )
echo "The following branches are at HEAD: ${branches[@]}"
;;
esac
fi
echo
fi
また、デタッチされたHEADで行われたコミットを単純に中止するためのpre-commitフックを追加しています(リベースでない限り)。私は、古典的な「私のコミットがすべて消えた」というパニックに陥った苦情を受け取るのをかなり恐れています。--no-verify
自分が何をしているのかを知っていれば、いつでもそれをバイパスすることができます。