14

如何在 GIT 中查找自上次提交构建以来所有更改的文件?我不仅要构建头部修订时的更改文件,还要构建自上次成功构建以来在此之前更改的所有已更改文件。

git show --pretty="format:" --name-only 将只为顶部提交更改的文件进行构建。像这样,我需要为自上次成功构建以来不同提交中的所有更改文件构建。

就像,上次在 Jenkins 中以 X SHA-1 id 完成的构建,在那之后,还有 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

我不完全确定我是否遵循您的问题,但需要考虑两件事:

  • git diff --stat {X SHA-1 ID}应该适用于您正在寻找的东西。或者,您可以更明确地执行git diff --stat {X SHA-1 ID} {X SHA-1 ID + 3 commits}这将为您提供两次提交之间的文件更改。这将输出如下内容:

    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 difftogrep '\|'获取具有文件名的行,然后将其通过管道传输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 回答
1

也许这就是你正在寻找的:

git whatchanged origin/master -n 1

这将告诉您自上次提交构建以来所有更改的文件。

要了解有关 git-whatchanged 命令的更多信息:https ://git-scm.com/docs/git-whatchanged/1.8.3

另外,如果您只想知道以前提交的更改,修改后的命令是:

git whatchanged -n 1

希望这有帮助。

于 2019-09-17T08:30:59.750 回答
0

如果你需要这个给詹金斯。

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 回答