在git别名函数中使用和检查可选参数

时间:2013-12-12 22:46:37

标签: macos git bash

我正试图用别名做一些疯狂的 git-fu 。具体来说,我想要一个git别名来根据它们是否为空读取传入参数,以不同的方式处理命令;有点像重载功能。我已经从其他问题(如this one)中创建了一些好的想法,但是以聪明的方式处理参数仍然是我的想法。

我最终做的是创建3个不同特异性水平的函数,并在具有默认值的链中调用它们。这是我在我的git配置中的一个部分。

# get the current local branch
current = symbolic-ref -q --short HEAD


# Calls sync-branch-with-origin-master using the current branch for the first property and origin as the remote name.
# ex. `git sync master` will checkout master from origin, pull the latest, checkout your current branch and rebase it with master.
sync = "!f() { currentBranch=$(git current); git sync-branch-with-master $currentBranch $1; }; f"

# get latest version of branch 2 from origin and rebase branch 1 onto it.
sync-branch-with-master = "!f() { git sync-branch-with-origin-master $1 origin $2; }; f"

# get latest version of branch $3 from origin $2 and rebase branch $1 onto it.
sync-branch-with-origin-master = "!f() { git checkout $3; git pull $2 $3; git checkout $1; git rebase $3; }; f"

这很棒!但我真正喜欢的是检查3美元或2美元是否存在并以不同方式处理这些情况的事情。

顺便说一句,我在Mac上使用bash。

1 个答案:

答案 0 :(得分:1)

可以在shell函数(f()中,在每个别名中)编写一个完整的脚本。尽管如此,这很快变得难以理解/不可维护。对于复杂的事情,我创建一个shell脚本并从别名中调用它。

#! /bin/sh
# git-foo.sh
... body of script goes here ...

然后:

git config alias.foo '!git-foo.sh'

或其他什么。

在这种特殊情况下,我怀疑你有什么是矫枉过正的:-)你可能只想使用git pull --rebasegit fetch后跟git rebase。 (并不是说这些与你所拥有的完全相同,所以也许不是;但请记住git pullget fetch基本相同,后跟git merge。)