215

我正在尝试创建一个同时使用多个 Git 命令和位置参数的别名。每个都有 Stackoverflow 页面,两者都做看起来很明显,但我遇到了麻烦。

例如,我想切换到分支 foo 并执行一个状态。所以在我的.gitconfig,我有:

  [alias] 
     chs = !sh -c 'git checkout $0 && git status'

这是行不通的。而这样的事情会起作用。

chs = !sh -c 'git checkout $0'

echoes = !sh -c 'echo hi && echo bye'

任何见解将不胜感激。

4

10 回答 10

177

这将起作用(使用 zsh 和 bash 测试):

[alias] chs = !git checkout $1 && git status
于 2011-09-23T20:11:16.913 回答
111

这针对 Windows 批处理/msysgit bash;可能不适用于其他环境。

正如 Olivier Verdier 和 Lily Ballard 所说

[alias] chs = !git checkout $1 && git status

几乎可以工作,但给出了一个虚假的额外插入参数......

git chs demo -> git checkout demo && git status demo

但是,如果您添加&& :到别名的末尾,则虚假参数将被消耗到位置标签中。

所以

[alias] chs = !git checkout $1 && git status && :

给出正确的输出... git chs demo -> git checkout demo && git status

于 2014-09-18T14:19:04.773 回答
84

您可以定义一个外壳函数。

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"
于 2011-09-23T20:14:14.590 回答
30

我能够创建多行且非常复杂的 git 别名。它们在 Windows 上运行良好,但我认为它们也可以在其他地方工作,例如:

safereset = "!f() { \
                trap 'echo ERROR: Operation failed; return' ERR; \
                echo Making sure there are no changes...; \
                last_status=$(git status --porcelain);\
                if [[ $last_status != \"\" ]]; then\
                    echo There are dirty files:;\
                    echo \"$last_status\";\
                    echo;\
                    echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
                    read dirty_operation;\
                    if [ \"$dirty_operation\" == \"Y\" ]; then \
                        echo Resetting...;\
                        git reset --hard;\
                    elif [ \"$dirty_operation\" == \"W\" ]; then\
                        echo Comitting WIP...;\
                        git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
                    else\
                        echo Operation cancelled;\
                        exit 1;\
                    fi;\
                fi;\
            }; \
            f"

我写了一篇文章,并在此处提供了更多示例。

于 2015-02-13T14:56:06.520 回答
26
[alias]
chs = !git branch && git status
于 2012-10-29T16:20:55.090 回答
6

\可以通过在每行末尾附加来获得多行 git 别名。

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "
于 2014-03-25T16:40:09.020 回答
6

试试这个:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"

像这样称呼它:git chs master

于 2013-04-12T15:54:19.017 回答
5

这里的问题是位置参数似乎被发送到 shell 命令两次(从 gi​​t 1.9.2 开始)。要明白我的意思,试试这个:

[alias]
  test = !git echo $*

然后,做git test this is my testing string。您应该观察到以下输出(为清楚起见,此处编辑了最后两行):

03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
          #1                         #2

解决此问题的一种方法是

[alias]
  chs = !git checkout $1 && git status && git echo x >/dev/null

这将消耗额外的位置参数,因为它被应用于最后一个回显命令并且对结果没有影响。

于 2014-05-08T20:40:14.850 回答
4
[alias]
      chs = !git checkout && git status
      ac = !git add . && git commit -m 

什么是 !?

如果别名扩展以感叹号为前缀,它将被视为 shell 命令。git config 别名中的感叹号是什么意思?

从 .gitconfig 文件调用别名

git chs
git ac "write_your_commit_message" 

别名对于在 git 中添加和提交更有用,您可以做得更快 Gif 显示更多数据

于 2021-03-20T00:02:11.770 回答
3

想要尝试不同别名的人的示例。

把它放在 GIT 配置文件的别名部分(例如~/.gitconfig):

[alias]
    a0 = "!echo $*"
    a1 = "!echo $* #"
    a2 = "!f () { echo \"$*\"; }; f "
    a3 = "!f () { echo \"$*\"; }; f #"
    a4 = "!f () { echo \"$*\"; }; f \"$*\" #"
    a5 = "!f () { echo \"$*\"; }; f \"$@\" #"
    a6 = "!f () { echo \"$*\"; }; f \"$1\" #"

然后执行这个命令:

cat ~/.gitconfig | grep --extended-regexp -- '(a[0-9])|(alias)' ; \
echo "" ; \
export CMD ; \
for I in {0..6} ; \
do \
    CMD="a""${I}" ; \
    echo -n "Executing alias.${CMD} = " ; \
    git config --global alias."${CMD}" ; \
    git $CMD 'hoi daar' en nu ; \
    git $CMD hoi daar en nu ; \
    echo "" ; \
done ; \
unset CMD ;

应该将此作为输出:

[alias]
    a0 = "!echo $*"
    a1 = "!echo $* #"
    a2 = "!f () { echo \"$*\"; }; f "
    a3 = "!f () { echo \"$*\"; }; f #"
    a4 = "!f () { echo \"$*\"; }; f \"$*\" #"
    a5 = "!f () { echo \"$*\"; }; f \"$@\" #"
    a6 = "!f () { echo \"$*\"; }; f \"$1\" #"

Executing alias.a0 = !echo $*
hoi daar en nu hoi daar en nu
hoi daar en nu hoi daar en nu

Executing alias.a1 = !echo $* #
hoi daar en nu
hoi daar en nu

Executing alias.a2 = !f () { echo "$*"; }; f 
hoi daar en nu
hoi daar en nu

Executing alias.a3 = !f () { echo "$*"; }; f #



Executing alias.a4 = !f () { echo "$*"; }; f "$*" #
hoi daar en nu
hoi daar en nu

Executing alias.a5 = !f () { echo "$*"; }; f "$@" #
hoi daar en nu
hoi daar en nu

Executing alias.a6 = !f () { echo "$*"; }; f "$1" #
hoi daar
hoi
于 2020-09-14T19:00:17.727 回答