给定子目录的.gitconfig不同?

pwuypxnk  于 2023-02-28  发布在  Git
关注(0)|答案(7)|浏览(158)

我使用两个不同的git邮件,一个用于工作,一个用于公共项目。最初我想我可以创建一个单独的.gitconfig,在一个文件夹中使用不同的邮件,我所有的公共repo都在其中,并且git会尊重这一点,但唉,似乎这并不起作用。什么是最好的方式来轻松地设置类似的东西?我想避免在每个公共repo中专门更改邮件。

pnwntuvh

pnwntuvh1#

自git2.13以来,最好的方法是使用条件包含。
示例(摘自答案here):
全局配置~/.gitconfig

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

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

工作特定配置~/work/.gitconfig

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

8fq7wneg2#

正如在其他答案中提到的,你不能为每个目录设置凭证,但是git允许你为每个仓库设置凭证。

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

这样,在你第一次提交时,你会得到一个错误提示,要求你提供名字和邮箱。在你的repo文件夹中,将你的凭据once添加到你的repo中,从那时起,你将使用这个身份提交:

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

v1l68za43#

我遇到了完全相同的问题。作为临时解决方案,我在我的.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上的人有更好的主意...

qxgroojn

qxgroojn4#

切换到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"
}
krugob8w

krugob8w5#

有一个集中的机制来创建回购协议。就像你的路径中的一些脚本等,你可以:

repo create -t public -n name

或者类似的东西。
repo命令(只是一个例子,与Android中的命令无关)将在必要的位置为您创建repo,读取配置文件,并根据类型是public还是private等为该repo设置凭据(在该repo的. git/config中)。

oiopk7p5

oiopk7p56#

真实的的答案是不可能的。
然而,多亏了@pithyless,而且因为我 * 已经 * 使用了一个自定义的'c'函数来切换目录,后面跟着一个auto 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;
}
xoshrz7s

xoshrz7s7#

我也有同样的需求,但我希望所有的.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,这取决于我使用的是什么仓库。
希望这能帮助你们中的一些人

相关问题