我有一组 git 别名,我在个人生活和专业职位上都使用它们。由于 git 使用中的长期约定,我已将
master
硬编码为许多这些别名中的默认“主”分支。
然而,我恰好在一家机构工作,那里的惯例是使用
main
作为主要分支。这意味着当我尝试使用它们时,我的很多别名都会被破坏,因为我已经硬编码了一个名为 master
的分支的假设,以及随之而来的用法。
我不知道是否可以在别名定义中使用一个变量,而不是在别名文件中更改
master
的实例,并针对不同情况维护该别名文件的单独版本,我可以在我的 .gitconfig
中设置一个变量
。比如:
$ cat .gitconfig
...
[variables]
DEFAULT_BRANCH = main
[include]
path = myaliases.git
$ cat myaliases.git
bclean = "!f() { git branch --merged ${1-DEFAULT_BRANCH} | grep -v " ${1-DEFAULT_BRANCH}$" | xargs -r git branch -d; }; f"
而不是
bclean = "!f() { git branch --merged ${1-master} | grep -v " ${1-master}$" | xargs -r git branch -d; }; f"
您不能直接使用 Git 别名来执行此操作(如 Git 扩展的部分)。您可以使用 shell 别名来完成此操作(如 shell 扩展的部分,可以通过直接 shell 别名,或通过使用
!
调用 shell 的 Git 别名)。
来自 Kraigolas 的评论建议使用符号名称,对于某些情况也是一个好建议:只需在这些存储库中将
master
作为 main
的符号名称即可。不过,唯一的正常符号名称是HEAD
,并且符号名称具有某些奇怪之处:例如,过去尝试删除符号名称时会删除其目标。
更直接的是,您可以使用
[include]
指令。对于您希望别名使用 main
的任何存储库,只需包含别名文件的(子)版本,将 master
替换为 main
。当然,这就是您所说的您不想做的事情,但是您编辑这些别名的频率是多少?您可以编写一个小脚本,从您的“主”配置文件(或者我应该将其称为您的“主”文件?)生成备用文件,并在您进行编辑时运行该脚本。请注意,您只需要通过包含来用后面的别名覆盖别名:
[include]
path = ~/.gitconfig.main
对于处理
~/.gitconfig
中别名的脚本,有多种方法可以解决这个问题。我的偏好是移动与 master 相关的别名并让 ~/.gitconfig
包含 ~/.gitconfig.master
本身,以便脚本只是:
sed -e s/master/main/ < ~/.gitconfig.master > ~/.gitconfig.main
但是,您可以想象并编写一些运行
git config --global --list
、提取 alias.*
条目等的东西。这变得很困难,因为你必须处理引用。
这是一个愚蠢的例子:
$ grep silly ~/.gitconfig
silly = rev-parse master
$ cat ~/.gitconfig.main
[alias]
silly = rev-parse main
在没有
git silly
部分的存储库中运行 include
会运行 git rev-parse master
。在存储库中运行 git silly
with include
部分运行 git rev-parse main
。
您可以在 .zshrc 文件(或 .bashrc,具体取决于您使用的 shell)中定义变量
# ~/.zshrc
export GIT_DEFAULT_BRANCH="main"
然后在你的 git 配置文件中
# ~/.gitconfig
[alias]
default = "!git checkout $GIT_DEFAULT_BRANCH"
您必须使用
!
语法才能完成此操作,并且每当您对 .zshrc 中的变量进行更改时,您都需要使用以下命令重新加载 .zshrc 文件:
$ . $HOME/.zshrc