Отличается .gitconfig для данного подкаталога? - PullRequest
27 голосов
/ 01 декабря 2011

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

Ответы [ 6 ]

7 голосов
/ 27 декабря 2011

Перейдя на 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"
}
7 голосов
/ 13 декабря 2011

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

5 голосов
/ 12 апреля 2017

Как уже упоминалось в других ответах, вы не можете установить свои учетные данные для каждого каталога.Но 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
5 голосов
/ 28 апреля 2012

Реальный ответ - это невозможно.

Однако, благодаря @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 голосов
/ 13 декабря 2011

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

repo create -t public -n name

или что-то в этом роде.

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

0 голосов
/ 29 января 2017

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

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

...