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

时间:2013-07-31 19:48:19

标签: 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次提交?

由于

5 个答案:

答案 0 :(得分:18)

派对迟到了,但稍微好一点的方法是在git diff上使用--name-only功能。我用的是如下:

git diff --name-only $GIT_PREVIOUS_COMMIT $GIT_COMMIT

这样你以后就不必做一些管道工作了。

答案 1 :(得分:5)

根据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}'`

答案 2 :(得分: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哈希值 - 您需要当前的repo HEAD(Check out Revision,我们将调用$CUR_HASH)并在Jenkins上次构建时提交(Last Build Revision,我们称之为$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}'`
    
  5. 我认为这涵盖了您尝试做的所有事情。显然,这些命令不能只是复制/粘贴,因为我不了解你的环境,但这是一个好的开始。

答案 3 :(得分: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

答案 4 :(得分:0)

也许这就是您要寻找的:

git whatchanged origin/master -n 1

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

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

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

git whatchanged -n 1

希望获得帮助。