Другой.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 в зависимости от того, с каким репозиторием я играю.
Надеюсь, что это может помочь некоторым из вас