是否有一个Git命令可用于确定合并是否在进程中(即未提交)?我知道我可以简单地检查一下.git/MERGE_HEAD,但对于命令行脚本来说这是正确的和/或面向未来的吗?
pat*_*ite 20
一个技巧是使用Git命令,如果合并正在进行中,该命令将失败.然后,您可以检查命令的返回码.您还需要确保该命令在成功时不会影响您的工作副本或索引.虽然有许多命令属于这一类,但似乎合适的命令之一
git merge HEAD
Run Code Online (Sandbox Code Playgroud)
如果合并正在进行,则返回128个代码,否则返回0.请注意,当合并不在进程中时,此命令将只打印已经是最新的,因为您只是与自己合并.因此,出于脚本目的,您可以这样做(在BASH中)
git merge HEAD &> /dev/null
result=$?
if [ $result -ne 0 ]
then
echo "Merge in progress."
else
echo "Merge not in progress."
fi
Run Code Online (Sandbox Code Playgroud)
请注意,即使使用--quiet标志git merge,进程内合并仍会导致此命令打印到错误流.这就是我将其输出重定向到的原因/dev/null.
Edw*_*son 10
您可以安全地检查MERGE_HEADgit目录[1]中是否存在,以确定是否正在进行合并.该MERGE_HEAD文件包含正在合并的提交ID,它将是已提交合并的n第一个父级.例如,如果我尝试合并分支br1在c085e0c:
> git merge --no-ff --no-commit br1
Automatic merge went well; stopping before committing as requested
> cat .git/MERGE_HEAD
c085e0caa2598064bfde9cc6318bd2c73fee2371
Run Code Online (Sandbox Code Playgroud)
如果您正在进行章鱼合并,那么您将在此文件中看到多个提交ID(换行符分隔):
> git merge --no-ff --no-commit br2 br3
Fast-forwarding to: br2
Trying simple merge with br3
Automatic merge went well; stopping before committing as requested
> cat .git/MERGE_HEAD
69b0169b1cba60de86161b375f013c59ad9581d8
99dad0187351d61ae8e88d49c96d7383f9e8fa6d
Run Code Online (Sandbox Code Playgroud)
使用MERGE_HEAD实际上是git客户端如何确定是否正在进行合并.有些人通过漏洞抽象提供了这种见解:
> git merge --abort
fatal: There is no merge to abort (MERGE_HEAD missing).
Run Code Online (Sandbox Code Playgroud)
因此,检查是否存在MERGE_HEAD是完全可以接受的,并且与软件中的任何内容一样是未来的证明 - 意味着任何更改git-merge都必须考虑到与其他git客户端的兼容性,并且(希望!)优雅地过渡和/或提供向后兼容性.
[1]您可以相信工作目录下面存在的信息MERGE_HEAD远远超过您的信任.git.有人可以使用--git-dir标志或GIT_DIR环境变量.
由于MERGE_HEAD仅在合并期间可用并且也是面向未来的,我们可以简单地使用git rev-list -1 MERGE_HEAD(方便的是,管道命令),如果MERGE_HEAD找不到,它将以代码 128 退出。管道 stdout 和 stderr 以/dev/null进行更清晰的检查。或者甚至更好,使用git rev-parse -q --verify MERGE_HEAD.
| 归档时间: |
|
| 查看次数: |
5318 次 |
| 最近记录: |