4

次の受信後フックを使用します。

GIT_TOP=`git rev-parse --show-toplevel`

while read oldrev newrev refname
do
        echo "=== $oldrev"
        echo "=== $newrev"
        echo "=== $refname"

        echo "=== 01. checkout -- $GIT_TOP/*"
        git checkout -- "$GIT_TOP/*"

        echo "=== 02. merging $refname"
        git merge $refname

        echo "=== 03. checkout -- $GIT_TOP/*"
        git checkout -- "$GIT_TOP/*"

done

アイデアは十分に明確です。現在のブランチをプッシュされたブランチとマージする必要があります。

  • 次に、実行します。git statusローカルツリーがブランチとは異なることがわかります。

  • git dirの先頭でもう1つ実行するよりもgit checkout -- *、このコマンドは私が望むことを実行しgit statusます。違いはもう表示されません。

このコマンドgit checkout -- "$GIT_TOP/*"がフックで機能せず、直接呼び出しでのみ機能するのはなぜですか?このコマンドをフックで実行するにはどうすればよいですか?

PS

git rev-parse --show-toplevelフック内から呼び出されると<myrepo>/.gitパスが返されることがわかりましたが、シェルからの値はちょうど<myrepo>です。これは問題の解決に役立つ可能性があります。

4

3 に答える 3

3

OK、今は動いています。もっと考えて、コピーを減らします。

export GIT_WORK_TREE=`pwd`
export GIT_DIR=`pwd`/.git

ポール

于 2012-10-01T18:30:26.787 に答える
2

export GIT_WORK_TREE=$GIT_DIR/.私の問題を解決しました。今git checkout -- "$GIT_TOP/*"はもう必要ありません。正しく動作するためgit merge $refname-正しいディレクトリで。

于 2012-07-07T16:20:02.463 に答える
1

このためのThx。

私はこれを試しました:

export GIT_WORK_TREE=$GIT_DIR/.
while read oldrev newrev refname
do
        echo "=== merging $refname"
        git merge $refname
done

エラーが返されました:「次のファイルへのローカル変更はマージによって上書きされます」..プッシュされたばかりのファイルに言及します。

これは、受け取ったばかりの変更をマスターブランチにマージしようとしていないことを示しています。

たぶん、そのチェックアウトマスターが必要でしたか?

手動でマージすることができました。

ポール

于 2012-10-01T15:41:22.593 に答える