列出受最新git拉取影响的文件

列出受最新git拉取影响的文件,git,deployment,Git,Deployment,问题与此类似: ,但有点不同。我需要的是获得一个受最新的git pull命令影响(添加/更改/删除)的文件列表 它可以是一个提交(在这种情况下,我可以通过git show(仅限姓名)进行提交,但也可以是多个提交,这是一个棘手的部分 实际示例:这样的部署脚本: git stash git pull origin production # ... some other stuff ... assets=$(git show --name-only --oneline ??LAST_GIT_PUL

问题与此类似:

,但有点不同。我需要的是获得一个受最新的
git pull
命令影响(添加/更改/删除)的文件列表

它可以是一个提交(在这种情况下,我可以通过git show(仅限姓名)进行提交,但也可以是多个提交,这是一个棘手的部分

实际示例:这样的部署脚本:

git stash
git pull origin production

# ... some other stuff ...

assets=$(git show --name-only --oneline ??LAST_GIT_PULL_RANGE?? | fgrep 'resource/assets' | wc -l)
test $assets -gt 0 && npm run production

(仅当
资源/资产
目录中发生更改时才编译js/css资源)

您可以尝试
git diff--name only??LAST_git_PULL_RANGE???--oneline


这对我来说很好。

这有点困难,原因如下:

  • git-pull
    意味着运行
    git-fetch
    ,然后运行第二个git命令以合并所获取的内容
  • Git不会在此处记录使用的第二个命令。第二个命令由运行Git pull的人选择,因此您必须确保运行它的人记住他们选择的命令。(该选择基于命令行选项和Git配置设置。)
  • 要获得正确答案,您需要使用的命令取决于输入的命令和使用的第二个命令
  • 实用示例:部署脚本

    部署脚本永远不应该使用
    git pull
    ,因此这为您提供了一个解决问题的简单方法:不要在部署脚本中使用
    git pull
    。运行
    git fetch
    ,然后运行您自己的第二个git命令。现在您可以确定使用了第二个命令,因为是您的脚本,而不是运行脚本的用户,选择第二个命令

    现在,让我们假设第二个命令,您在脚本中选择的命令,是
    git merge
    。这里仍然存在一个问题,因为
    git merge
    可以进行快进合并,但它可以进行真正的合并。如果它进行真正的合并,则合并可能失败。如果您告诉它只进行快进合并(使用
    git merge--ff only
    ),如果需要真正的合并,也可能失败

    这里没有针对所有情况的单一正确操作。您必须根据自己的情况决定希望发生什么。但现在,让我们假设
    git merge--ff only
    以及“如果合并失败,则完全中止部署”形式的测试就足够了。然后您的脚本将包含以下行:

    git fetch origin || die ...
    starthash=$(git rev-parse HEAD) || die ...
    git merge --ff-only || die ...
    
    其中,
    die
    是您编写的shell函数,用于中止此部署。换句话说,我们将:

  • 使用
    git-fetch-origin
    更新本地git存储库,其中包含来自
    origin
    的新提交、更新
    origin/master
    origin/develop

    这是第一行,
    git fetch origin | | die…
    所做的。同样,您必须编写
    die
    函数

  • 保存当前哈希ID,以便在运行
    git merge--ff only
    之前知道哪个提交是当前的

  • 运行
    git merge--ff only
    ,这样我们就可以得到一个快进合并,或者如果无法进行快进合并(如果需要真正的合并),则会失败

    (注意:如果您想在这种情况下尝试真正的合并,这会使部署复杂化!您需要决定如果真正的合并停止以获得用户的帮助,该怎么办。)

  • 如果以上所有操作都进行得很顺利,那么现在就可以将
    git合并--ff only
    之前的
    HEAD
    提交中的内容与
    git合并--ff only
    之后的
    HEAD
    提交中的内容进行比较了。您可以通过一个简单的
    git diff
    来实现这一点,或者为了脚本的可靠性,
    git diff tree
    。(一般来说,
    git diff tree
    命令使用起来有点困难,但不受每用户配置的影响,因此在任何非面向用户的脚本中使用
    git diff tree
    是明智的做法。)因此,现在您可以运行:

    git diff --name-only $starthash HEAD
    
    或:


    在这种情况下,两者都会产生相同的输出,除了
    git diff tree
    关闭了重命名检测器,而不管用户的
    git diff
    配置如何。这只会在重命名检测器打开并找到重命名时产生明显的差异,即使这样,除非您从
    --仅名称
    到--name status:您将看到一个添加文件和一个删除文件被替换为一个从旧名称到新名称的重命名文件操作。

    感谢您对“不要在部署脚本中使用git pull”的见解。我将进行重构。这是:
    starthash=$(git rev parse HEAD)
    -是我一直在寻找的宝石!再次感谢:-)
    git diff-tree --name-only $starthash HEAD