管道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中还原它:

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解决方案可以工作。