给定子目录的不同.gitconfig?

时间:2011-12-01 05:46:28

标签: git email git-config

我使用两个不同的git电子邮件,一个用于工作,一个用于公共项目。最初我以为我可以在我所有的公共存储库所在的文件夹中创建一个单独的.gitconfig和不同的电子邮件,而git会尊重它,但唉似乎不起作用。什么是轻松设置类似内容的最佳方式?我想避免在每个公共回购中专门更改电子邮件。

7 个答案:

答案 0 :(得分:19)

自git 2.13 起,执行此操作的最佳方法是使用Conditional includes

一个示例(从答案here复制):

全局配置〜/ .gitconfig

[user]
    name = John Doe
    email = john@doe.tld

[includeIf "gitdir:~/work/"]
    path = ~/work/.gitconfig

工作特定的配置〜/ work / .gitconfig

[user]
    email = john.doe@company.tld

答案 1 :(得分:7)

我有完全相同的问题。作为临时解决方案,我在.bashrc

中有这个
alias git='GIT_AUTHOR_EMAIL=$(
      p=$(pwd)
      while [[ $p != "$HOME" ]]; do
        [ -e $p/.gitemail ] && cat $p/.gitemail && break
        p=$(dirname $p)
      done) GIT_COMMITTER_EMAIL=$(
      p=$(pwd)
      while [[ $p != "$HOME" ]]; do
        [ -e $p/.gitemail ] && cat $p/.gitemail && break
        p=$(dirname $p)
      done) /usr/bin/git'
alias g=git

这样我在父目录中有两个不同的.gitemail文件:

  • ~/work/.gitemail
  • ~/github/.gitemail

请注意,我只是以这种方式切换user.email,其他所有内容都集中在~/.gitconfig中。它是一个解决方案,但它并不好。

希望StackOverflow上有人有更好的想法...

答案 2 :(得分:7)

切换到ZSH后,这是我使用在目录更改时触发的“配置文件”修改了问题的解决方案。这个解决方案的好处是它可以用于其他设置。

将其弹出到您的zsh配置中:

#
# Thanks to: Michael Prokop. 
# More documentation: 
# http://git.grml.org/?p=grml-etc-core.git;f=etc/zsh/zshrc;hb=HEAD#l1120
#
CHPWD_PROFILE='default'
function chpwd_profiles() {
    local -x profile

    zstyle -s ":chpwd:profiles:${PWD}" profile profile || profile='default'
    if (( ${+functions[chpwd_profile_$profile]} )) ; then
        chpwd_profile_${profile}
    fi

    CHPWD_PROFILE="${profile}"
    return 0
}
chpwd_functions=( ${chpwd_functions} chpwd_profiles )

chpwd_profile_default # run DEFAULT profile automatically

然后在你的zsh git自定义中的其他地方:

zstyle ':chpwd:profiles:/home/user/work(|/|/*)'  profile work
zstyle ':chpwd:profiles:/home/user/fun(|/|/*)'   profile fun

# configuration for profile 'default':
chpwd_profile_default()
{
  [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
  print "chpwd(): Switching to profile: default"

  export GIT_AUTHOR_EMAIL="default@example.com"
  export GIT_COMMITTER_EMAIL="default@example.com"
}

# configuration for profile 'fun':
chpwd_profile_fun()
{
  [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
  print "chpwd(): Switching to profile: $profile"

  export GIT_AUTHOR_EMAIL="fun@example.com"
  export GIT_COMMITTER_EMAIL="fun@example.com"
}

# configuration for profile 'work':
chpwd_profile_work()
{
  [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
  print "chpwd(): Switching to profile: $profile"

  export GIT_AUTHOR_EMAIL="work@example.com"
  export GIT_COMMITTER_EMAIL="work@example.com"
}

答案 3 :(得分:5)

真正的答案是它不可能。

但是,感谢@pithyless,并且因为我已经使用自定义'c'函数切换目录后跟自动ls,这就是我现在正在做的事情:

# cd + ls, and change git email when in personal projects folder 
function c {
  if [[ "`abspath $1`" == *"$HOME/Projects"* ]]; then
    export GIT_AUTHOR_EMAIL="personal@gmail.com"
  else
    export GIT_AUTHOR_EMAIL="me@work.com"
  fi
  cd "${@:-$HOME}" && ls;
}

答案 4 :(得分:5)

正如其他答案所述,您无法为每个目录设置凭据。但是git允许你在每个存储库的基础上这样做。

# Require setting user.name and email per-repo
$ git config --global user.useConfigOnly true

这样,在您第一次提交时,您将收到一个错误,要求您提供姓名和电子邮件。在您的repo文件夹中,将您的凭据一次添加到您的仓库中,然后您将使用此身份提交:

$ cd path/to/repo
$ git config user.name My Name
$ git config user.email mail@example.com

答案 5 :(得分:4)

有一个集中的机制来创建回购。就像您路径中的某些脚本一样:

repo create -t public -n name

或类似的东西。

repo命令(只是一个例子,与Android中的一个无关)将在必要的位置为您创建回购并读取配置文件并设置该回购的凭据(在.git / config中为该回购)基于公共或私人等类型。

答案 6 :(得分:0)

我有同样的需求,但我希望所有.gitconfig部分都可以覆盖,而不仅仅是user.email和user.name。

因为我没有找到任何我做过的事:https://github.com/arount/recursive-gitconfig

以下是当前代码,但请参阅github源代码以获取最新更新:

# Look for closest .gitconfig file in parent directories
# This file will be used as main .gitconfig file.
function __recursive_gitconfig_git {
    gitconfig_file=$(__recursive_gitconfig_closest)
    if [ "$gitconfig_file" != '' ]; then
        home="$(dirname $gitconfig_file)/"
        HOME=$home /usr/bin/git "$@"
    else
        /usr/bin/git "$@"
    fi
}

# Look for closest .gitconfig file in parents directories
function __recursive_gitconfig_closest {
    slashes=${PWD//[^\/]/}
    directory="$PWD"
    for (( n=${#slashes}; n>0; --n ))
    do
        test -e "$directory/.gitconfig" && echo "$directory/.gitconfig" && return 
    directory="$directory/.."
    done
}

alias git='__recursive_gitconfig_git'

这允许我根据我正在玩的存储库使用特定的.gitconfig。

希望这可以帮助你们中的一些人