如何在git中查找完整jenkins构建的所有已更改文件的列表,而不是特定的提交?

use*_*169 11 git jenkins

自从上次在GIT中提交构建以来如何查找所有已更改的文件?我不仅要在头版本中构建已更改的文件,还要构建自上次成功构建以来所有已更改的文件.

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

比如,最后一次构建在Jenkins的X SHA-1 id中完成,之后,还有3次提交.所以,我的目标是检查整个存储库代码库直到head,然后查找在X SHA-1 id之后更改的所有文件的列表,这是在X SHA-1 id的最后一次提交之上的3次提交?

谢谢

for*_*ect 19

派对的晚了一点,但稍微好一点的方法是使用--name-onlygit diff上的功能.我用的是如下:

git diff --name-only $GIT_PREVIOUS_COMMIT $GIT_COMMIT
Run Code Online (Sandbox Code Playgroud)

这样你就不必再做一些管道工作了.


小智 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}'`
Run Code Online (Sandbox Code Playgroud)


Xii*_*ian 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 +++++++++++
    
    Run Code Online (Sandbox Code Playgroud)

    我将其作为练习,供读者将输出解析为文件列表。

  • 您可能应该在 Jenkins 中进行完整、干净的构建,而不仅仅是构建某些文件。您最终可能会遇到构建文件之间奇怪的不兼容性问题。但这超出了这个问题的范围。

---编辑更多信息---

将此问题分解为几个部分:

  1. 获取要使用的 SHA1 哈希值- 您需要存储库的当前 HEAD(检查修订版,我们将其称为$CUR_HASH)并在 Jenkins 上次构建时提交(上次构建修订版,我们将其称为$LAST_HASH)。听起来你已经有了这些,如果没有,那就超出了问题的范围。
  2. $LAST_HASH获取在和 之间更改的文件列表$CUR_HASH- 这是前面提到的git diff --stat $LAST_HASH $CUR_HASH命令,它将打印出类似上面的内容。
  3. 仅从输出中获取文件名- 在 bash 中执行此操作,您可以通过管道传输git diffto的输出以grep '\|'获取带有文件名的行,然后通过管道传输 to以获取文件名,而不包含统计信息。所以现在的命令是这样的:awk '{print $1}

    git diff --stat $LAST_HASH $CUR_HASH | grep '\|' | awk '{print $1}'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 仅从更改的文件创建 tarball - 您可以将上述输出发送到 tar,如下所示:

    tar cvzf /tmp/build.tar.gz `git diff --stat $LAST_HASH $CUR_HASH | grep '\|' | awk '{print $1}'`
    
    Run Code Online (Sandbox Code Playgroud)

我认为这涵盖了您想要做的一切。显然,这些命令不能只是复制/粘贴,因为我不知道有关您的环境的所有信息,但这是一个好的开始。