【问题标题】:git undo alias with xargs带有 xargs 的 git 撤消别名
【发布时间】:2011-09-27 17:17:09
【问题描述】:

我有一个 git 别名 (git undo),可以撤消工作目录中的所有内容,包括新文件、更改的文件和删除的文件:

!git reset --hard && git ls-files -d | xargs -0 git rm --ignore-unmatch && git clean -fq

在 OS X 上,这很好用。然而,在 Linux 上,我遇到了以下问题:如果没有从存储库中删除文件,git ls-files -d | xargs -0 git rm --ignore-unmatch 命令将失败(xargs 将不会传递任何内容)。

如果xargs 没有收到来自git ls-files 的任何消息,有没有办法让xargs 默默地继续前进?

【问题讨论】:

  • 如果您将-0 选项传递给xargs,那么您还必须将-z 选项与git ls-files 一起使用。
  • 请注意,要撤消一切,您可能(也可能不想)说git clean -qfdx(参见git help clean

标签: git alias xargs


【解决方案1】:

git reset --hard 之前,git ls-files -d 应该永远不会生成任何输出(如果确实如此,您可能希望使用 git ls-files -d -z 让它为 xargs -0 生成以 NUL 结尾的输出)。

完成git reset --hard 后,工作树的跟踪部分和整个索引将匹配 HEAD 提交。 git ls-files -d 只会显示索引中的文件,而不是工作树中的文件。由于工作树将拥有索引所拥有的所有内容,因此在硬重置后不应该有任何已删除的文件。

git clean 位可用于删除未跟踪的文件(git reset --hard 不会触及),但您可能希望将其更改为 git clean -dfq 以同时删除完全未跟踪的目录。

【讨论】:

  • 啊,好吧 - 我明白了。似乎一次做太多事情。
【解决方案2】:

来自man page

--no-run-if-empty, -r
如果标准输入不包含任何非空格,请不要运行
命令。通常,即使有
,该命令也会运行一次 没有输入。此选项是 GNU 扩展。

确保您的 xargs 版本具有该选项 (man xargs)

【讨论】:

  • 这看起来像是答案 - 奇怪的是 OS X 版本的 xargs 没有这个选项(或默认使用它)。猜猜我必须制作一些特定于操作系统的别名。 ;)
  • OS X 是基于 FreeBSD 的,FreeBSD 版本的 xargs 也是如此。它符合 POSIX,但没有 GNU 扩展。
【解决方案3】:

也许你想使用 xargs 的“-r”选项:

xargs -r -0 git rm --ignore-unmatch

这样,如果ls-files 什么都不显示,xargs 根本不会调用git rm

【讨论】:

    【解决方案4】:

    有“git clean”(man git-clean):从工作树中删除未跟踪的文件

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 1970-01-01
      • 2014-11-11
      • 2016-12-07
      • 2014-10-01
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多