Git别名中的管道?
Posted
技术标签:
【中文标题】Git别名中的管道?【英文标题】:Pipes in a Git alias? 【发布时间】:2013-10-31 18:24:42 【问题描述】:我从事的功能分支具有令人讨厌的大名,因此当我需要从本地功能分支向上推送到功能分支时,我经常会使用当前的分支名称,如下所示:
git branch | grep '*' | sed 's/* //' | xargs git push origin
这很好用。我想把它设为别名,所以我在~/.gitconfig
中做了这个:
[alias]
pushcur = branch | grep '*' | sed 's/* //' | xargs git push origin
现在,当我运行 git pushcur
时,我收到以下错误:
usage: git branch [options] [-r | -a] [--merged | --no-merged]
让我相信别名没有正确解析管道。我还应该做些什么来实现所需的别名?
【问题讨论】:
与解决一般问题无关,但在相当新的 git 版本中,您可以将push.default
(或push.origin.default
将效果限制为origin
)配置为current
(虽然upstream
有时可能更合适)。请参阅git-config 中的 push.default 部分。
考虑也使用 bash 自动补全来 TAB 删除分支名称!带有 oh-my-zsh 的 zsh 默认有它;)
类似问题以及关于 git 别名的附加答案:***.com/questions/46528736/…
【参考方案1】:
一个简单的解决方法是将其添加为 shell 别名。
这是一个例子:
alias grf="git rebase -i $(git merge-base --fork-point master)"
(基于当前分支的 fork commit 和 master 交互)
对于bash,将其添加到~/.bashrc
,然后您可以简单地使用grf
。
【讨论】:
【参考方案2】:我不认为你可以,但你可以在它前面加上 !
以将该命令视为新的 shell 命令
[alias]
pushcur = ! git branch | grep '*' …
【讨论】:
"但是,也许您想运行外部命令,而不是 Git 子命令。在这种情况下,您可以使用 ! 字符开始命令。" - git book 这个问题是我来到这里的确切原因,但我尝试的 bang pipe 引用组合因“致命错误配置行”而失败。我认为真正的问题是由于我使用引号的方式。我通过将sed
管道更改为tr
管道来消除引号。我不得不双重转义反斜杠所以使用...| tr \\\\n
正确地转义字符串有时可能是地狱,是的......
使用!
允许我在别名中包含管道,但它不维护当前目录。您必须包含 $GIT_PREFIX
才能回到您开始使用子命令的位置,例如 ls-files
我必须这样做 git ls-files $GIT_PREFIX |
....
@GabrielStaples,通常参数会附加到命令中,但如果你想把它们放在其他地方,诀窍是创建像par321 = "!par321() echo $3 $2 $1 ; ; par321"
这样的bash函数,然后git par321 1 2 3
将输出3 2 1
。
【参考方案3】:
我通常会制作小的 git-
脚本并将它们放在我的路径中的目录 (~/.local/bin
) 中。查看git-extras 获取大量优秀示例。
【讨论】:
以上是关于Git别名中的管道?的主要内容,如果未能解决你的问题,请参考以下文章