我可以在.gitconfig中为自己指定多个用户吗?

半腔热情 提交于 2019-12-24 17:57:35

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

~/.gitconfig ,我在[user]我的个人电子邮件地址,因为这是我要用于Github存储库的地址。

但是,我最近也开始使用git进行工作。 我公司的git repo允许我提交,但是当它发布新变更集的公告时,它说它们来自匿名用户,因为它无法识别我的.gitconfig的电子邮件地址-至少,这是我的理论。

是否可以在.gitconfig指定多个[user]定义? 还是有其他方法可以覆盖某个目录的默认.gitconfig ? 就我而言,我在~/worksrc/签出所有工作代码-有没有一种方法可以仅为该目录(及其子目录)指定.gitconfig


#1楼

或者,您可以在本地.git/config文件中添加以下信息

[user]  
    name = Your Name
    email = your.email@gmail.com

#2楼

Orr Sella的博客文章中获得一些启发后,我编写了一个预提交钩子(位于~/.git/templates/hooks ),该~/.git/templates/hooks将根据本地存储库./.git/config的信息设置特定的用户名和电子邮件地址。 ./.git/config

您必须将模板目录的路径放入~/.gitconfig

[init]
    templatedir = ~/.git/templates

然后,每个git initgit clone将选择该钩子,并在下一次git commit期间应用用户数据。 如果要将钩子应用于已经存在的存储库,则只需在存储库中运行git init即可将其重新初始化。

这是我想出的钩子(仍然需要打磨-欢迎提出建议)。 另存为

~/.git/templates/hooks/pre_commit

要么

~/.git/templates/hooks/post-checkout

并确保它是可执行的: chmod +x ./post-checkout || chmod +x ./pre_commit chmod +x ./post-checkout || chmod +x ./pre_commit

#!/usr/bin/env bash

# -------- USER CONFIG
# Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
git_remotes[0]="Github"
git_remotes[1]="Gitlab"

# Adjust names and e-mail addresses
local_id_0[0]="my_name_0"
local_id_0[1]="my_email_0"

local_id_1[0]="my_name_1"
local_id_1[1]="my_email_1"

local_fallback_id[0]="${local_id_0[0]}"
local_fallback_id[1]="${local_id_0[1]}"


# -------- FUNCTIONS
setIdentity()
{
    local current_id local_id

    current_id[0]="$(git config --get --local user.name)"
    current_id[1]="$(git config --get --local user.email)"

    local_id=("$@")

    if [[ "${current_id[0]}" == "${local_id[0]}" &&
          "${current_id[1]}" == "${local_id[1]}" ]]; then
        printf " Local identity is:\n"
        printf "»  User: %s\n»  Mail: %s\n\n" "${current_id[@]}"
    else
        printf "»  User: %s\n»  Mail: %s\n\n" "${local_id[@]}"
        git config --local user.name "${local_id[0]}"
        git config --local user.email "${local_id[1]}"
    fi

    return 0
}

# -------- IMPLEMENTATION
current_remote_url="$(git config --get --local remote.origin.url)"

if [[ "$current_remote_url" ]]; then

    for service in "${git_remotes[@]}"; do

        # Disable case sensitivity for regex matching
        shopt -s nocasematch

        if [[ "$current_remote_url" =~ $service ]]; then
            case "$service" in

                "${git_remotes[0]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[0]}"
                    setIdentity "${local_id_0[@]}"
                    exit 0
                    ;;

                "${git_remotes[1]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[1]}"
                    setIdentity "${local_id_1[@]}"
                    exit 0
                    ;;

                * )
                    printf "\n»  pre-commit hook: unknown error\n» Quitting.\n"
                    exit 1
                    ;;

            esac
        fi
    done
else
    printf "\n»» An Intermission\n»  No remote repository set. Using local fallback identity:\n"
    printf "»  User: %s\n»  Mail: %s\n\n" "${local_fallback_id[@]}"

    # Get the user's attention for a second
    sleep 1

    git config --local user.name "${local_fallback_id[0]}"
    git config --local user.email "${local_fallback_id[1]}"
fi

exit 0

编辑:

因此,我将钩子重写为Python中的钩子和命令。 另外,也可以将脚本作为Git命令调用( git passport )。 也可以在配置文件( ~/.gitpassport )中定义任意数量的ID,这些ID可在提示符下选择。 您可以在github.com上找到该项目: git-passport-一个Git命令并用Python编写的钩子来管理多个Git帐户/用户身份


#3楼

Windows环境

如果已在系统中安装了它,则可以从Git Extensions --> Settings --> Global Settings进行修改。

gitextensions-最新发布

右键单击Windows环境中的文件夹/目录以访问这些设置。

更新如何在2.49版中切换/维护多个设置


#4楼

另一个选项,以获取git与多个名称/电子邮件的工作是由别名git和使用-c标志覆盖全局和库特定的配置。

例如,通过定义别名:

alias git='/usr/bin/git -c user.name="Your name" -c user.email="name@example.com"'

要查看它是否有效,只需键入git config user.email

$ git config user.email
name@example.com

除了别名,您还可以在$PATH放置一个自定义git可执行文件。

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="name@example.com" "$@"

这些方法优于特定于存储库的.git/config的优点是,当自定义git程序处于活动状态时,它适用于每个git存储库。 这样,您可以轻松地在用户/名称之间切换,而无需修改任何(共享)配置。


#5楼

如果您不想使用默认电子邮件地址( 电子邮件地址链接到github用户 ),则可以配置要询问的地址。 如何做到这一点取决于您使用的git版本,请参见下文。

(预期的)缺点是您必须为每个存储库配置一次电子邮件地址(和名称)。 因此,您不能忘记这样做。

版本<2.7.0

[user]
    name = Your name
    email = "(none)"

在全局配置~/.gitconfig如Dan Aloni在Orr Sella的博客文章中的评论中所述。 尝试在存储库中进行第一次提交时,git失败,并显示一条漂亮消息:

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '(none)')

当电子邮件地址在本地设置时,该名称是从全局配置中获取的(消息不是很准确)。

2.7.0≤版本<2.8.0

版本低于2.7.0的行为不是预期的,并已用2.7.0修复。 您仍然可以按照Orr Sella的博客文章中所述使用预提交挂钩。 此解决方案也适用于其他版本,但其他解决方案不适用于该版本。

版本≥2.8.0

Dan Aloni添加了实现该行为的选项(请参阅发行说明 )。 搭配使用:

[user]
    useConfigOnly = true

为了使其正常工作,您可能无法在全局配置中提供名称或电子邮件地址。 然后,在第一次提交时,您会收到一条错误消息

fatal: user.useConfigOnly set but no name given

因此,该消息不是很有启发性,但是由于您显式设置了该选项,因此您应该知道该怎么做。 与版本低于2.7.0的解决方案相比,您始终必须手动设置名称和电子邮件。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!