git 挂钩设置用户名和电子邮件

git hook to set username and email

是否可以编写一个 git 钩子在第一次提交之前设置用户名和电子邮件?用户名和电子邮件应根据配置的参数设置,例如存储库/域正则表达式或其他参数。

我尝试编写不同的类型,但我只成功地在第一次提交之后配置更改。

编辑

我的代码如下所示(基于 Create a global git commit hook):

.git-templates/hooks/ -> cat pre-commit 
#!/bin/bash
remote=$(git config --get remote.origin.url)
if [ -n "$remote" ]; then
    if [[ $remote =~ "specific_domain" ]]; then
        git config user.email "myname@specific_domain.tld"
        git config user.name "Firstname Lastname"
    else
        git config user.email "pseudonym@general_domain.tld"
        git config user.name "pseudonym"
    fi
fi

Git 在运行预提交挂钩时已经设置了所有信息。您可以通过编写此始终失败的预提交挂钩来观察这一点:

#! /bin/sh

echo pre-commit hook run
env | grep GIT
exit 1

观察 GIT_AUTHOR_NAMEGIT_AUTHOR_EMAILGIT_AUTHOR_DATE 已经设置。这些是将进入提交的值。由于它们是环境变量,因此您在挂钩中所做的任何更改都不会影响父 Git 进程。

可以 做的是编写一个预提交挂钩,检查名称和电子邮件地址是否设置正确。如果不是,它可以立即更新它们并退出 1,或者打印提醒以配置它们(连同实际的 git config 命令,适用于剪切和粘贴)并退出 1。这并不完美但会处理很多用例。

我找到了问题的别名解决方案

# Git
# gcw
# sets local username + email in repo
# Usage: gcw git-repo-to-clone
git_clone_wrapper () {
    first_arg = "$ 1"
    if [$ # -ne 1]
    then
        echo "only works with one argument (repo)"
        exit
    fi
    git clone "$ first_arg"
    python - << EOF
import os
from urlparse import urlparse
result = urlparse ("$ first_arg")
git_repo_full = result.path.rpartition ('/') [2] # get last element
git_repo_dir = git_repo_full.split ('.') [0]
os.chdir (os.getcwd () + '/' + git_repo_dir)
os.system ('git config --local user.name "Firstname Lastname"')
os.system ('git config --local user.email "myname@specific_domain.tld"')
EOF
}
alias gcw = 'git_clone_wrapper'

您可以将 gcw 用于您的私人物品和全局 git 配置,将 git clone 用于您的 public。

我写了一篇关于它的小文章here