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别名中的管道?的主要内容,如果未能解决你的问题,请参考以下文章

使用后缀别名和 MySQL 管道

pfsense 单IP网络别名管道限速的设置

为“管道 grep”创建别名

从git中的现有分支创建新分支时如何不触发管道?

Perl:当子/管道的文件句柄被别名时,关闭子进程失败

shell别名,管道,用户配置文件,变量,read