Другой.gitconfig для данного подкаталога?

Я использую два разных письма git, одно для работы и одно для публичных проектов. Сначала я думал, что смогу создать отдельный.gitconfig с другим адресом электронной почты в папке, в которой находятся все мои публичные репозитории, и этот git будет уважать это, но, увы, похоже, что это не работает. Какой лучший способ легко настроить что-то подобное? Я хочу избежать необходимости специально менять электронную почту в каждом публичном репо.

6 ответов

Решение

Реальный ответ заключается в том, что это невозможно.

Тем не менее, благодаря @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;
}

Наилучший способ сделать это, поскольку git 2.13 - использовать Conditional includes.

Пример (скопирован из ответа здесь):

Глобальная конфигурация ~/.gitconfig

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

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

Конфигурация для работы ~/work/.gitconfig

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

Как упоминалось в других ответах, вы не можете установить свои учетные данные для каждого каталога. Но git позволяет вам делать это для каждого репозитория.

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

Таким образом, при первом коммите вы получите сообщение об ошибке с просьбой указать имя и адрес электронной почты. В своей папке репо добавьте свои учетные данные один раз в репо, и с этого момента вы подтвердите свою личность:

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

У меня точно такая же проблема. В качестве временного решения, у меня есть это в моем .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, Это решение, но это не здорово.

Надеясь, что кто-то на Stackru имеет лучшую идею...

После перехода на 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"
}

Иметь централизованный механизм для создания репо. Как какой-то скрипт на вашем пути и т.д., посредством которого вы делаете:

repo create -t public -n name

или что-то типа того.

Команда repo (просто пример, не имеющий ничего общего с Android) создаст для вас репо в нужном месте, прочитает файл конфигурации и установит учетные данные для этого репо (в.git / config для этого репо) основанный на типе, являющемся публичным или частным и т. д.

У меня были такие же потребности, но я хотел, чтобы все разделы.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 в зависимости от того, с каким репозиторием я играю.

Надеюсь, что это может помочь некоторым из вас

Другие вопросы по тегам