管道git差异到git校验
如果我删除一个文件,我可以使用以下方法在git中还原它:管道git差异到git校验,git,Git,如果我删除一个文件,我可以使用以下方法在git中还原它: git checkout filename 如果我想恢复所有已删除的文件,我可以将它们列出: git diff --diff-filter=D --name-only 然后我想做的是恢复它们,但是 git diff --diff-filter=D --name-only | git checkout 不起作用,它只是将列表重复到stdout,而git checkout似乎没有收到任何输入。git签出头也是如此——以此类推 我曾在Wi
git checkout filename
如果我想恢复所有已删除的文件,我可以将它们列出:
git diff --diff-filter=D --name-only
然后我想做的是恢复它们,但是
git diff --diff-filter=D --name-only | git checkout
不起作用,它只是将列表重复到stdout,而git checkout似乎没有收到任何输入。git签出头也是如此——以此类推
我曾在Windows命令提示符、Powershell和Git Bash中尝试过这一点,每次都有相同的结果
如何将输入正确地导入git checkout?不能使用管道进行此操作。但是,您可以使用Unix的
xargs
:
git diff --diff-filter=D --name-only | xargs git checkout
xargs
是一个工具,它从stdin读取数据,将行作为参数放在自己的参数旁边,并调用结果。因此,如果git diff
生成一行a
和一行b
,xargs git checkout
将至少从概念上生成行git checkout a b
,并将其作为命令调用。管道导致管道左侧命令的标准输出用作管道右侧命令的标准输入。管道git checkout | git diff--diff filter=D--name only
导致git checkout
命令的标准输出被用作git diff--diff filter=D--name only
命令的标准输入。git-diff
命令不使用标准输入,因此git-checkout
输出将被静默忽略,您将得到git-diff
命令的输出
相反,可以尝试类似于
gitls文件--deleted-z | xargs-0git签出头--
。这将使用空字符(\0
)来分隔文件名,并将导致签出已删除的文件。这将适用于任何有效的文件名,包括那些包含空格和其他特殊字符的文件名。不使用xargs
:git checkout--$(git diff--diff filter=D--name only | tr'\n'')
这两种解决方案都可以在Windows上使用git Bash。xargs版本可以在Windows命令提示符下正常工作,但使用$()的替代方法不行。我认为这是因为git bash基本上模拟了linux bash shell。但是@AntonioPérez确实展示了一个很好的方法来消除xargs
依赖项(尽管它需要tr
或另一个字符串处理工具,这也可能是一个弱点)+安东尼奥斯评论1。有帮助,但。。。命令的输出为git根提供了相对路径名,即使您位于子目录中。在我的例子中,我刚刚错误地在子目录中添加了所有未跟踪的文件。有没有办法驯服git diff--name的输出,改为提供相对路径名?@Starman:在管道前面的命令中添加--relative
参数。谢谢,我用纯管道尝试了两种方法,但结果相同。xargs解决方案可以工作。