From 0b04a4de500654744ec50674b54c939fd3f2f3cd Mon Sep 17 00:00:00 2001 From: laily Date: Mon, 14 Sep 2026 14:55:44 +0800 Subject: [PATCH] feat: split git user identity by repo directory Leave global name/email empty with useConfigOnly so unmatched repos cannot commit. Personal identity applies under ~/.dotfile, ~/code, and ~/.pouch; work identity stays in local ~/.gitconfig.work for ~/workrepo. --- AGENTS.md | 4 ++++ git/.gitconfig | 15 ++++++++++++--- git/.gitconfig.personal | 4 ++++ script/git-init.sh | 15 +++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 git/.gitconfig.personal diff --git a/AGENTS.md b/AGENTS.md index 2325b4b..caad661 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -61,6 +61,10 @@ ff reload # 重载 fish 配置 ## Git 配置 - 公共配置在 `git/.gitconfig` +- **身份**:不设全局 `user.name` / `user.email`,`user.useConfigOnly = true`。未匹配目录时拒绝 commit,避免错用身份 + - `~/.dotfile/`、`~/code/`、`~/.pouch/` → `git/.gitconfig.personal`(个人,进仓库,已写 name/email) + - `~/workrepo/` → `~/.gitconfig.work`(公司,仅本机;`git-init` 会生成空模板) + - include 目标文件必须存在,否则该目录下 git 命令会 fatal - **凭据**(所有 Git 版本):`git/git-credential.sh` 写在主配置里,使用 `!$HOME/.dotfile/...`(Git 不展开 `~`) - macOS:`osxkeychain` → 回退 `store`(`~/.git-credentials`) - Linux:`libsecret` → 回退 `store` diff --git a/git/.gitconfig b/git/.gitconfig index 654866f..67aa1c3 100644 --- a/git/.gitconfig +++ b/git/.gitconfig @@ -1,6 +1,7 @@ +# 不设全局 user.name / user.email,避免未匹配目录误用身份。 +# useConfigOnly(Git 2.8+):未配置时拒绝 commit,而不是猜系统用户名。 [user] - name = laily - email = i@laily.net + useConfigOnly = true [core] autocrlf = input quotepath = false @@ -42,8 +43,16 @@ [mergetool "nvimdiff"] cmd = nvim -d \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\" trustExitCode = true +# 按仓库目录套身份。个人身份在 git/.gitconfig.personal;公司邮箱只放本机 ~/.gitconfig.work。 +# include 目标文件必须存在,否则该目录下 git 命令会直接 fatal。 +[includeIf "gitdir:~/.dotfile/"] + path = ~/.dotfile/git/.gitconfig.personal +[includeIf "gitdir:~/code/"] + path = ~/.dotfile/git/.gitconfig.personal +[includeIf "gitdir:~/.pouch/"] + path = ~/.dotfile/git/.gitconfig.personal [includeIf "gitdir:~/workrepo/"] - path = ~/.workgitconfig + path = ~/.gitconfig.work [rebase] autoSquash = true autoStash = true diff --git a/git/.gitconfig.personal b/git/.gitconfig.personal new file mode 100644 index 0000000..c961e2b --- /dev/null +++ b/git/.gitconfig.personal @@ -0,0 +1,4 @@ +# 个人身份:~/.dotfile、~/code、~/.pouch(由 includeIf gitdir 加载) +[user] + name = laily + email = i@laily.net diff --git a/script/git-init.sh b/script/git-init.sh index 041c7ff..021c556 100755 --- a/script/git-init.sh +++ b/script/git-init.sh @@ -11,6 +11,7 @@ usage() { 备份已有 ~/.gitconfig,软链接到 ~/.dotfile/git/.gitconfig。 同时为 git-credential.sh 添加可执行权限。 +若本机还没有 ~/.gitconfig.work,则生成空模板(~/workrepo 公司身份,需自行填写)。 凭据由 ~/.dotfile/git/git-credential.sh 处理(兼容 Git < 2.36,低版本回退 store)。 @@ -41,3 +42,17 @@ fi chmod +x "$HOME/.dotfile/git/git-credential.sh" # 兼容旧路径:若仍存在则保持可执行 chmod +x "$HOME/.dotfile/git/git-credential-linux.sh" 2>/dev/null || true + +work_cfg="$HOME/.gitconfig.work" +if [ -e "$work_cfg" ]; then + echo " $work_cfg already exists, skip" +else + cat > "$work_cfg" <<'EOF' +# 公司 Git 身份(仅本机,不要提交到 dotfile) +# ~/workrepo 下的仓库会加载本文件。取消注释并填写后再 commit: +# [user] +# name = Your Name +# email = you@company.com +EOF + echo " Created $work_cfg — fill in company user.name / user.email" +fi