中央の Git ベア リポジトリがあります。そのレポにプッシュが行われたときに、受信後フックを実行したいと思います。そのフックが行うことは、Basecamp プロジェクトで (API を使用して) メッセージを作成することです。実行したばかりの更新に関する情報が必要です。現時点でgit log -2 --stat
は十分だと思いますが、もう少し情報が必要です (ブランチが更新され、ファイルが作成され、ファイルが削除されました)。すべての情報を取得するために必要なコマンドを誰かが手伝ってくれますか? 複数のコマンドを実行しても問題ありません。おそらく、すべての情報を取得できる単一のコマンドはありません。
3 に答える
の下のファイルを調べて並べ替えることで、最新のコミットを見つけることができます.git/refs/heads
。新しいコミットが行われるたびに、対応するrefs/heads
ファイルが変更されます。つまり、にコミットするとmaster
、refs/heads/master
更新されます。
それでは、ソリューションを開発しましょう。
最初のタスク:すべてのブランチ (つまり、下にあるすべてのファイル) を見つけrefs/heads
て、それらが最後に変更されたときに出力します。フックについて話しているので、.git/hooks
ディレクトリからの相対パスを指定します。
find ../refs/heads -type f -printf '%T@ %p\n'
これにより、変更日とともにすべてのブランチのリストが生成されます。パラメータの説明については、のマニュアル ページをfind
参照してください。
2番目のタスク:取得したリストをソートする
find ../refs/heads -type f -printf '%T@ %p\n' |\
sort
3 番目のタスク:そのリストの最新の要素が必要です。sort
古いものから新しいものへと並べ替えられているので、私たちの目的のアイテムはリストの一番下にあります。この要素を次のように取得しますtail
(アイテムは 1 つだけなので、-1
フラグを渡します):
find ../refs/heads -type f -printf '%T@ %p\n' |\
sort |\
tail -1
4 番目のタスク:取得した行に日付をドロップします。ステートメントからprintf
、日付とパスがスペースで区切られていることがわかります。これを区切り文字としてcut
( -d " "
) に入力し、2 番目のフィールド (つまり、ファイル パス-f 2
) が必要であることを伝えます。便宜上、このファイル パスを という変数に格納します$LATESTHEAD
。
LATESTHEAD=$(\
find ../refs/heads -type f -printf '%T@ %p\n' |\
sort |\
tail -1 |\
cut -d ' ' -f 2 )
5 番目のタスク:これでファイル名はわかりましたが、コンテンツが必要です。これは に渡すことができる最新のリビジョンですgit log
。cat
仕事をします。最新のリビジョンを$LATESTREV
LATESTHEAD=$(\
find ../refs/heads -type f -printf '%T@ %p\n' |\
sort |\
tail -1 |\
cut -d ' ' -f 2 )
LATESTREV=$(cat $LATESTHEAD)
$LATESTREV
これで、必要な汚いことを行うために使用できます。
おそらく最もエレガントな解決策ではありませんが (おそらく誰かが現れて、はるかに簡単なワンライナーを教えてくれるでしょう)、私にとってはうまくいきます。
git ログに追加--summary
すると、新しいファイルと削除されたファイルの一覧が生成されます (git はそれらを「ノード」と呼びます)。
git log --stat --summary -1
ブランチを取得するには、次を実行してみてください。
git branch --contains `git log --oneline -1 |cut -f1 -d\ ` |cut -b3-
注: 私は自分の Mac でこれをテストしています。Unixcut
のインデックスは 1 ですが、Debiancut
のインデックスは 0 だと思います。その場合、Debianボックスを使用している場合は、に変更-f1
する-f0
と、ブランチコマンドが正常に機能するはずです
を使用する特定の理由がない場合は、コマンド ライン引数として古い ref、新しい ref、およびブランチを取得するpost-receive
を使用することをお勧めします。update
git log
したがって、ここで提案されているコマンドを使用し、引数として指定して (とそれぞれoldref..newref
を置き換えて) 、ログ全体を取得できます。oldref
newref
詳細については、更新フックの githooks(5) マンページを参照してください。必要に応じて、その時点で更新を中止することもできます。
実際には、post-receive
標準入力のフックで同じ情報を取得します。find
そのタスクを達成するために多くのコマンドを実行する必要がある理由がわかりません。