【问题标题】:What's the easiest way to use the output paths from a git command in a subsequent git command?在后续的 git 命令中使用 git 命令的输出路径的最简单方法是什么?
【发布时间】:2015-11-15 12:24:46
【问题描述】:

我经常用鼠标来做这样的事情:

/home/me-$ git log --name-status -1  
commit a10e63af1f4b1b2c28055fed55d4f2bb3225a541
Author: Me <me@me.com>
Date:   Tue Aug 18 13:04:04 2015 -0400

    XYZ-376 make ctors public

M       x/y/z/Class1.java
M       x/y/z/Class2.java

/home/me-$ git checkout -- x/y/z/Class2.java  # <-- copy/paste with the mouse

我知道一些 git 命令接受通配符,这在一定程度上缓解了这个问题,但我想知道是否有办法专门从以前的命令中引用路径规范等。

如何在不使用鼠标且不手动重新输入长路径的情况下运行这样的命令?

【问题讨论】:

  • 您可以使用ctrl+r 使用shell 历史记录。
  • 您如何选择要使用先前输出的哪一部分?
  • @VishnuAtrai 我对输出感兴趣,而不是命令本身。
  • @EricRenouf 为澄清而编辑;一般来说,我说的是路径规范,但同样的问题可能适用于分支名称、遥控器等。
  • @jordanpg 您能否澄清一下您是否想在git log --name-status -1 的输出中列出的所有路径上运行 git checkout?

标签: linux git bash shell command-line


【解决方案1】:

在 OS X 上,iTerm2(可能还有其他一些终端模拟器)支持的“无鼠标复制”是一个可行的解决方案:https://www.iterm2.com/features.html

  • 搜索字符串的某些部分 (⌘F)
  • 向右(tab)或向左(shift-tab)展开选择
  • 使用 (option-enter) 粘贴选择或以通常方式复制/粘贴

【讨论】:

    【解决方案2】:

    这就是你在 emacs 下运行 shell 的那种事情,在其中运行你所有的 shell 并有一个命令来遍历缓冲区以查找输出中的模式。

    为了从以前的命令中检索您没有在 shell 会话中捕获的输出,您将不得不以某种方式从终端仿真器的缓冲区中获取它。 The xterm family has a configurable "copy the whole scrollback buffer" thingy,然后xclip -o 将打印所选内容,您可以将其通过提取过滤器进行管道传输。

    但它要么在会话中捕获输出,要么在之后从输出缓冲区中抓取它,这是数据曾经存在的任何地方。

    【讨论】:

      【解决方案3】:

      我通常为此使用子 shell ($(&lt;command in subshell here...&gt;))。

      例如,有时我删除了很多文件,我不得不git rm每个文件。

      有一个命令git ls-files --deleted 返回所有丢失文件的名称。我可以像这样将它与git rm 结合起来:

      git rm $(git ls-files --deleted)
      

      这是一个不好的例子,因为(正如我后来发现的),使用git add --all 可以更轻松地实现此操作。但我认为它说明了这一点。


      在您的情况下,如果您想签出在上一次提交中已更改的所有文件,则很难解析 git log --name-status 的输出,因为它包含附加信息,但您可以使用类似 @987654328 的内容@ 代替。

      所以:

      git checkout $(git diff HEAD^ --name-only)
      

      将在您的示例中这样做。

      我注意到使用$(...) 语法的一个好处是它在 Bash 和 PowerShell 中的 中都有效。

      【讨论】:

      • 我认为这种方法可以与执行以下操作的小型实用程序一起使用:git diff --name-only | cat -n; getFileNumber.sh 2,其中新命令执行类似!! | cat -n | grep $linenum | awk '{print $2}' 的操作。
      • 我在这里遇到的问题是fatal: Unable to create '../.git/index.lock': File exists.,因为在另一个 git 命令内的命令替换块中运行 git。我想知道是否有办法告诉 git 忽略只读命令的锁定文件?
      • 不知道有没有。但是你确定为了避免两次点击而经历这样的痛苦值得吗?
      • 这里还有一个想法:如果你只想要一个文件,但它的路径很长,你可以使用 glob 语法来避免输入路径:git checkout -- **Class2.java。请注意,这将检查 repo 中名为 Class2.java 的所有文件。但我仍然觉得-- ** 很有用并且经常使用它。
      • 在运行你自己的命令之前运行eval export ${!GIT_*} 有帮助吗?我给它可能工作了一半,试一试。
      猜你喜欢
      • 2023-04-10
      • 2017-06-28
      • 2014-02-06
      • 2013-01-12
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      相关资源
      最近更新 更多