【问题标题】:Passing a parameter through pipe in bash在bash中通过管道传递参数
【发布时间】:2023-03-16 12:57:02
【问题描述】:

我正在尝试通过终端中的管道为 git 命令传递一个参数,并且像往常一样,我不知道自己在做什么。

目前:git rm --cached folder/path | rm -rf folder/path | git commit -m '...'

如果可能,我希望不必在第二个命令中重复使用文件夹路径,但我不确定如何从第一个命令中获取 folder/path

有没有可能,还是我找错树了?

【问题讨论】:

  • folpath="folder/path"; git rm --cached $folpath | rm -rf $folpath | git commit -m '...' 不工作吗?
  • 我认为是这样,但事实证明我无法在同一行上运行 commit 命令,因为它会导致 lockfile 错误。

标签: git bash terminal


【解决方案1】:

你不应该做管道。

rm folder/file
git rm !$
git commit -m "your message"

学习 bash 中的 bang (!) 运算符非常值得。再次指定长路径并不是最好的。

对于我的大部分工作流程,我可以摆脱这个:

rm path/to/unwanted/file
git add -A # stages ALL changes in the work tree
git commit -m "my message"

如果我正在修复之前的提交,该提交错误地添加了我不想要的文件,您可以通过将上述代码 sn-p 中的最后一次提交更改为来修改该提交

git commit --amend -C HEAD

这将重用来自当前提交的消息。

您可能希望包含 git status 的输出以及您正在尝试执行的操作。

【讨论】:

  • 尽管这不是我想要做的(再次尝试成为一个聪明的笨蛋),但它是解决问题的更好方法。非常感谢亚当。
【解决方案2】:
x=/folder/path && git rm --cached $x | rm -rf $x | git commit -m '...' && unset x

【讨论】:

  • $x 会保留第一个管道之后的值吗?
【解决方案3】:

我认为这应该可行:

param=/folder/path; git rm --cached $param | rm -rf $param | git commit -m '...'

编辑:@pholser 解决方案通过使用unset 从环境中删除变量来使事情变得更干净。这也可以在subshell 中运行命令来完成:

(param=/folder/path; git rm --cached $param | rm -rf $param | git commit -m '...')

【讨论】:

    【解决方案4】:

    您不需要分别从索引中删除和从文件系统中删除,git rm 旨在两者兼而有之:

    git rm -r folder/path
    

    通过管道传递到rmgit commit 没有任何意义,因为它们都不会以您正在尝试的形式从标准输入中读取。您可以只使用; 来分隔命令。

    【讨论】:

      猜你喜欢
      • 2020-01-06
      • 2021-09-11
      • 2013-03-30
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多