列出受最新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 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
函数
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