Git 似乎支持三个级别的配置值:
- 每个系统的全局设置(存储在
/etc/git-core
) - 每用户全局设置(存储在
~/.gitconfig
) - 每个存储库的本地设置(存储在
$REPO/.git/config
)
这些选项涵盖了大部分基础,但我正在寻找一种处理第四级的方法。我有一个(非常)大的存储库集合,我需要使用与user.email
平常不同的值。这些存储库通常是通过自动化脚本创建和操作的,并且设置每个存储库的本地设置非常麻烦。
所有有问题的存储库都位于我的本地系统上的某个路径前缀下。有没有办法在某个地方设置一个配置值,该值将被该路径下的所有存储库继承? (类似于.htaccess
设置一直继承到文件系统。)也许有一种方法可以在全局配置文件中设置条件值?在 UNIX 环境中还可以进行哪些其他安排来处理像我这样的一组存储库?
答案1
我没有找到在第四级配置 git 的方法。唯一的方法似乎是使用 覆盖每个命令的配置值git -c key=value
。
我当前的 hacky 解决方案是定义一个 shell 函数作为 git 的包装器。调用时,它将参数传递到系统 git 命令,但不会在检查当前工作目录并向命令添加额外参数(如果适用)之前进行。
function git () {
case "$PWD" in
/path/to/repos/*)
command git -c [email protected] "$@"
;;
*)
command git "$@"
;;
esac
}
答案2
根据git配置查看这个解决方案:
https://dzone.com/articles/how-to-use-gitconfigs-includeif
添加到“~/.gitconfig”文件:
[includeIf "gitdir:~/work/project1/.git"]
path = .gitconfig-project1
创建“~/.gitconfig-project1”文件,内容如下:
[core]
sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"
[user]
name = user1
email = [email protected]
答案3
您可以使用环境变量配置 git 的电子邮件地址GIT_AUTHOR_EMAIL
。如果你把它与进入目录时执行 bash 脚本或者使用 zsh 进行目录特定的 shell 配置您可以轻松更改每个目录或父目录的设置,例如,如果您进入目录,~/work
您可以自动调整环境变量来更改您的电子邮件地址。
答案4
根据 Caleb 的回答,我们可以定义一个修改后的git
命令,该命令永久正确地配置此目录中的所有存储库,以便将来所有使用 vanilla git 的都将使用新配置。我使用hub
,这是另一个 git 包装器,所以我alias git=hub
用它替换了 my 并hub
在我的函数中调用 - 如果您不使用hub
,请将所有hub
调用替换为command git
:
function git() {
case "$PWD" in
/home/robin/git/3RD_PARTY)
hub "$@"
# We don't know which repository was cloned / operated on, so let's just reconfigure them all
for f in *; do
[[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
done
;;
/home/robin/git/3RD_PARTY/*)
hub "$@"
hub config user.email $my_private_email
;;
*)
hub "$@"
;;
esac
}
与 Caleb 的答案不同,它仅在 shell 中工作(除非明确来源,否则仅在交互式 shell 中),这也会影响正确读取 git 配置的其他 git 前端,例如 emacs magit。