14

GIT で最後にコミットされたビルド以降に変更されたすべてのファイルを見つける方法は? ヘッド リビジョンで変更されたファイルだけでなく、前回の成功したビルド以降に変更されたすべての変更ファイルもビルドしたいと考えています。

git show --pretty="format:" --name-only は、最上位のコミットで変更されたファイルに対してのみビルドを行います。このように、最後に成功したビルド以降、異なるコミットで変更されたすべてのファイルをビルドする必要があります。

のように、X SHA-1 id で Jenkins で行われた最後のビルド、およびその後、その上にさらに 3 つのコミットがあります。したがって、私の目的は、リポジトリ コードベース全体を先頭までチェックアウトし、X SHA-1 id の後に変更されたすべてのファイルのリストを見つけることです。つまり、X SHA-1 id での最後のコミットの上に 3 つのコミットがありますか?

ありがとう

4

5 に答える 5

23

パーティーには少し遅れましたが、少し良い方法は、--name-onlygit diff の機能を使用することです。私が使用したものは次のとおりです。

git diff --name-only $GIT_PREVIOUS_COMMIT $GIT_COMMIT

これにより、後で配管作業を行う必要がなくなります。

于 2016-11-11T19:54:04.217 に答える
6

https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin#GitPlugin-Environmentvariablesによると、Jenkins は環境変数を提供します。

  • GIT_COMMIT - 現在の SHA
  • GIT_PREVIOUS_COMMIT - 同じブランチから以前にビルドされたコミットの SHA (ブランチの最初のビルドの現在の SHA)

それらを活用して、同様のことを達成する予定です。

したがって、次のようなものが必要になります。

tar cvzf /tmp/build.tar.gz `git diff --stat $GIT_PREVIOUS_COMMIT $GIT_COMMIT | grep '\|' | awk '{print $1}'`
于 2013-10-11T16:46:03.173 に答える
4

私はあなたの質問に従うかどうか完全にはわかりませんが、次の 2 つの点を考慮してください。

  • git diff --stat {X SHA-1 ID}あなたが探しているもののために働くはずです。または、より明示的に行うことgit diff --stat {X SHA-1 ID} {X SHA-1 ID + 3 commits}で、指定された 2 つのコミット間のファイルの変更が得られます。これにより、次のような出力が得られます。

    Library/ENV/4.3/cc                |  3 ++-
    Library/Formula/cmu-sphinxbase.rb | 10 +++++++---
    Library/Formula/fb-client.rb      | 11 +++++++++++
    

    その出力をファイルのリストだけに解析することは、読者の演習として残しておきます。

  • おそらく、特定のファイルをビルドするだけでなく、Jenkins で完全でクリーンなビルドを行う必要があります。ビルドされたファイル間の奇妙な非互換性に巻き込まれる可能性があります。しかし、それはこの質問の範囲を超えています。

---詳細情報を編集してください---

この問題をいくつかの部分に分解するには:

  1. 使用する SHA1 ハッシュを取得する- リポジトリの現在の HEAD (リビジョンのチェックアウト、これを と呼びます$CUR_HASH) と、Jenkins が最後にビルドしたときにコミット (最終ビルド リビジョン、と呼びます$LAST_HASH) が必要です。あなたはすでにこれらを持っているようですが、そうでなければ、それは質問の範囲を超えています.
  2. $LAST_HASHと の間で変更されたファイルのリストを取得$CUR_HASH- これは前述のgit diff --stat $LAST_HASH $CUR_HASHコマンドで、上記のような内容を出力します。
  3. 出力からファイル名だけを取得- これを bash で行うと、出力を にパイプgit diffして、ファイル名を含む行だけgrep '\|'を取得し、次に にパイプして、統計なしでファイル名だけを取得できます。したがって、コマンドは次のようになります。awk '{print $1}

    git diff --stat $LAST_HASH $CUR_HASH | grep '\|' | awk '{print $1}'
    
  4. 変更されたファイルだけから tarball を作成します。上記の出力を次のように tar に送信できます。

    tar cvzf /tmp/build.tar.gz `git diff --stat $LAST_HASH $CUR_HASH | grep '\|' | awk '{print $1}'`
    

あなたがやろうとしていることはすべて網羅されていると思います。もちろん、私はあなたの環境についてすべてを知っているわけではないので、これらのコマンドを単にコピーして貼り付けることはできませんが、それは良い出発点です。

于 2013-07-31T20:11:45.490 に答える
0

Jenkinsにこれが必要な場合。

prev_merge=$(git log |grep -C1 Merge | grep commit |head -n1 | awk {'print $2'})
commit=$(git log |head -n 1  | awk {'print $2'})
git diff --name-only $prev_merge $commit
于 2019-02-28T19:37:33.943 に答える