8

中央の Git ベア リポジトリがあります。そのレポにプッシュが行われたときに、受信後フックを実行したいと思います。そのフックが行うことは、Basecamp プロジェクトで (API を使用して) メッセージを作成することです。実行したばかりの更新に関する情報が必要です。現時点でgit log -2 --statは十分だと思いますが、もう少し情報が必要です (ブランチが更新され、ファイルが作成され、ファイルが削除されました)。すべての情報を取得するために必要なコマンドを誰かが手伝ってくれますか? 複数のコマンドを実行しても問題ありません。おそらく、すべての情報を取得できる単一のコマンドはありません。

4

3 に答える 3

3

の下のファイルを調べて並べ替えることで、最新のコミットを見つけることができます.git/refs/heads。新しいコミットが行われるたびに、対応するrefs/headsファイルが変更されます。つまり、にコミットするとmasterrefs/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 logcat仕事をします。最新のリビジョンを$LATESTREV

LATESTHEAD=$(\
    find ../refs/heads -type f -printf '%T@ %p\n' |\
    sort    |\
    tail -1 |\
    cut -d ' ' -f 2 )
LATESTREV=$(cat $LATESTHEAD)

$LATESTREVこれで、必要な汚いことを行うために使用できます。

おそらく最もエレガントな解決策ではありませんが (おそらく誰かが現れて、はるかに簡単なワンライナーを教えてくれるでしょう)、私にとってはうまくいきます。

于 2012-06-22T05:45:25.887 に答える
2

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と、ブランチコマンドが正常に機能するはずです

于 2012-06-22T06:05:06.817 に答える
2

を使用する特定の理由がない場合は、コマンド ライン引数として古い ref、新しい ref、およびブランチを取得するpost-receiveを使用することをお勧めします。update

git logしたがって、ここで提案されているコマンドを使用し、引数として指定して (とそれぞれoldref..newrefを置き換えて) 、ログ全体を取得できます。oldrefnewref

詳細については、更新フックの githooks(5) マンページを参照してください。必要に応じて、その時点で更新を中止することもできます。

実際には、post-receive標準入力のフックで同じ情報を取得します。findそのタスクを達成するために多くのコマンドを実行する必要がある理由がわかりません。

于 2012-06-22T13:19:51.887 に答える