如何处理 git 别名的组合

Posted

技术标签:

【中文标题】如何处理 git 别名的组合【英文标题】:How to deal with combinations of git aliases 【发布时间】:2021-01-10 07:48:14 【问题描述】:

问题

我在 .gitconfig 中定义了三个 git 别名(外部 bash 脚本定义了一个名为 diff-lines 的函数):

    [alias]
        diffc = diff --cached
        diffnw = diff -w --ignore-cr-at-eol --ignore-all-space
        diffln =!bash -c 'source $HOME/.bash_functions/diff-lines && git diff | diff-lines'

如何定义 'diffln' 以便与其他别名结合使用?

我正在寻找一些东西来避免我必须定义类似于以下的每个版本:

    diffcln =!bash -c 'source $HOME/.bash_functions/diff-lines && git diffc | diff-lines'
    diffnwln =!bash -c 'source $HOME/.bash_functions/diff-lines && git diffnw | diff-lines'
    diffcnwln =!bash -c 'source $HOME/.bash_functions/diff-lines && git diffnw --cached | diff-lines'
    etc...

以前的尝试

我试过这个:diffln =!bash -c 'source $HOME/.bash_functions/diff-lines && git $@ | diff-lines' 并通过以下方式调用:$ git diffln diffc 但它只是给了我默认的 git 选项,就好像我只是在调用 $ git

【问题讨论】:

【参考方案1】:

在它之后添加一个东西。通常:bash -c "blabla" _bash -c "balbla" --

bash -c "" <here> 之后的第一个参数是$0 - 第二个 参数是$1

还要记住引号 - 将 $anything 放在双引号内以防止分词和文件名扩展。但我不确定 git 是如何处理的。

diffln =!bash -c 'source "$HOME/.bash_functions/diff-lines" && git "$@" | diff-lines' _

如果你想要一个“默认”参数,你可以:

diffln =!bash -c 'source "$HOME/.bash_functions/diff-lines" && if ((!$#)); then set -- diff; fi && git "$@" | diff-lines' _

【讨论】:

谢谢,最后添加一些东西的技巧让我大部分时间解决了这个问题。我不断收到“未终止的带引号的字符串错误”,因此解决方案的其余部分是将整个内容放在双引号中。完整的工作命令是这样的(如果没有提供参数,默认选项使用 git diff): diffln = "!bash -c 'source $HOME/.bash_functions/diff-lines && [ $# -eq 0 ] && git diff | diff-lines || echo "$@" | xargs git | diff-lines;' _" echo "$@" | xargs git 太可怕了。做git "$@"。就像echo $(echo $(echo soemthing)))

以上是关于如何处理 git 别名的组合的主要内容,如果未能解决你的问题,请参考以下文章

Simple JavaJava是如何处理别名(aliasing)的

端口被占用如何处理

如何处理 1 --> 0..1 关系?

合并发布者时如何处理错误?

whatsapp 是如何处理特殊字符、unicode 和 emoji 的

如何处理字符之间有空格的单词?