したがって、次の 2 つのことが必要なようです。
したがって、これらのコミットを識別して処理するスクリプトを作成する必要があります (名前git-something
を付けてパスに配置するため、追加の git コマンドになります)。スクリプトがローカルコミットを認識するためのトリガーが必要です。これを行う簡単な方法は、スクリプトが認識できるように、コミットの説明 (実際のコミットや共有コミットでは決して使用しないもの) に魔法の言葉を入れることです。(それがあなたにとってあまりにも不安定に聞こえる場合は、コミットのツリーで特別なファイルを使用することもできます.THIS_COMMIT_IS_LOCAL_ONLY
.
現在のインデックス/作業ディレクトリからローカル コミットを行うコマンドが必要です。これは簡単で、呼び出すだけですgit commit $@ -m "__LOCAL_COMMIT_ONLY__"
(これは一例です。重要なのは、作成中のコミットをローカルのみとしてマークし、git commit を延期することです)。また、すべてのローカル コミットを一時的にポップし、他の git コマンド (pull、push、fetch、merge など) を実行してから、ローカル コミットを再適用するコマンドも必要です。また、このコマンドを使用して、共有する予定のローカル コミットを作成し、履歴のローカルのみのコミットの「下」に常に表示されるようにします。
両方を 1 つにまとめたスクリプトの例を次に示します。
#!/bin/sh
if [[ $1 eq 'new' ]]; then
shift
exec git commit $@ -m "__LOCAL_COMMIT_ONLY__"
elif [[ $1 eq
OLD_HEAD=$(git rev-parse HEAD)
OLD_REAL_HEAD="$(git rev-list HEAD --grep=__LOCAL_COMMIT_ONLY__ | tail -n1)^"
git reset --soft $OLD_REAL_HEAD
git $@
git rebase --onto HEAD $OLD_REAL_HEAD $OLD_HEAD
ここで、スクリプトを呼び出すと仮定するとgit-local
、git local new
インデックスから新しいローカルのみのコミットを作成する (またはgit local new -a
作業ディレクトリ内の変更されたファイルからgit local commit
作成する) ために使用し (悲しいことに、名前は不完全です)、新しい「実際の」コミットを作成します。git local push
押す、git local pull
引くなど。
これの主な欠点は、ほとんどのコマンドに接頭辞が付いていることを覚えておく必要があることですlocal
。これを一度忘れてしまうと、少しうんざりしますが、それほど悪くはありません.クイックgit rebase -i
を使用すると、ローカルコミットを簡単にトップに戻すことができ、オフにして再び実行できます. 最大のリスクは、誤ってgit push
代わりに使用git local push
して、すべてのプライベートな変更をアップストリームに送信することです。これは、全員を悩ませます。そのためには、実際に git 自体の代わりに呼び出す小さなラッパー スクリプトを作成することをお勧めします (それを呼び出して、パス上にある~/bin/git
ことを確認~/bin
してください)。
#!/bin/sh
if [[ $1 = 'push' ]]; then
if /usr/bin/git rev-list HEAD --grep=__LOCAL_COMMIT_ONLY__ | grep -q .; then
echo "Can't push with local changes still active!"
echo "Try using `git local push' instead."
exit 1
fi
fi
exec /usr/bin/git "$@"
pre-receive
メッセージに含まれるコミットを自動的に拒否するフックをサーバーに作成することもでき__LOCAL_COMMIT_ONLY__
ます。