git merge-file 因使用 git show 的 bash 进程替换运算符而失败

标签 git bash fifo

我正在尝试使用三向 merge 将 git 中文件的更改 merge 到不受版本控制 ( more context ) 的文件中。

因为有一个 git merge-file <local> <base> <other>它需要 3 个文件,并且由于我不喜欢创建中间文件并忘记清理它们,所以我使用了 bash <(...)像我经常做的那样处理替换运算符。

事实证明,这似乎并没有像预期的那样工作,因为以下示例在两个不同系统上的 git 2.4.2 和 2.4.3 上显示。

示例:

让我们为此创建一个小测试,以便我们知道我们在说什么。我们将创建一个文件 foo.txt (git 中至少有 2 个版本的那个)和一个文件 bar.txt不受版本控制:

git init
echo -e 'foo\nbar' > foo.txt
git add foo.txt
git commit -m'init'
echo -e 'foo\nbar\nend' > foo.txt
git commit -a -m'end'
echo -e 'start\nfoo\nbar' > bar.txt
git show HEAD^:foo.txt > foo.txt.base
git show master:foo.txt > foo.txt.end

这给我们留下了几个看起来像这样的文件:

foo.txt @ HEAD^ & foo.txt.base:

foo
bar

foo.txt @master & foo.txt.end:

foo
bar
end

栏.txt:

start
foo
bar

中间文件:

现在让我们运行 git merge-file -p bar.txt foo.txt.base foo.txt.end :

start
foo
bar
end

这也是我希望通过以下方法获得的输出。

使用流程替换:

但是如果我运行:git merge-file -p bar.txt <(git show HEAD^:foo.txt) <(git show master:foo.txt) ,我得到这个输出:

start
foo
bar

这不是预期的(有时!)echo $?版画 1指示错误。

更奇怪的是,由于我无法理解这种行为,所以我决定重新运行上述命令(向上箭头),当出现此输出时更加困惑:

<<<<<<< bar.txt
start
foo
bar
=======
foo
bar
end
>>>>>>> /dev/fd/62

因为我真的没想到会失败,更不用说不确定性了,我又跑了几次也找到了这个输出:

<<<<<<< bar.txt
start
foo
bar
=======
>>>>>>> /dev/fd/62

为了缩小问题范围,我尝试了 git merge-file -p bar.txt <(echo -e 'foo\nbar') <(echo -e 'foo\nbar\nend')可靠地打印预期的 merge :

start
foo
bar
end

问题

谁能解释一下这种奇怪的行为?

我显然可以通过不使用进程替换来修复它,但我想了解为什么会发生这种情况,因为我在很多 bash 脚本中使用进程替换。此外,我对允许我仍然使用进程替换的解决方法很感兴趣。

此外,如果您认为这是一个错误,我想知道它源自哪个组件:git show , git merge-file还是庆典?

最佳答案

正如评论和 here 中指出的那样这可能是 <(...) 的问题提供不支持 seek 的类似 FIFO 的文件.除非像这样调用,否则 ZSH 中会显示相同的行为:

git merge-file -p bar.txt =(git show HEAD^:foo.txt) =(git show master:foo.txt)

这意味着问题源于git merge-file期待它可以的文件 seek上,同时 <(...)不提供这些。

关于git merge-file 因使用 git show 的 bash 进程替换运算符而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30832327/

相关文章:

git - 如何从一个大的 Git 树中分离出一个小的库

linux - 在 shell 脚本 `ffmpeg` 一些迭代中循环创建 "loses"的分支

linux - Bash - 通过运行第二个命令更新终端标题

linux - Fifos 和交互式命令 (gpg)

git - fatal error : Can't resolve host github. com

python - 无法将 python 代码部署到 heroku

windows - 在 git 中使用具有相同名称但在 Windows 中大小写不同的目录

linux - 为什么这个变量的一部分在与字符串组合时会被替换?

python - 如何将信息提供给 Python 守护进程?

linux - 如何实现 ABA 解决方案?