Я использую две разные git электронные письма, одну для работы и одну для публичных проектов. Первоначально я думал, что могу создать отдельный .gitconfig с другим адресом электронной почты в папке, где находятся все мои публичные репозитории, и что git будет уважать это, но, похоже, это не работает. Какой лучший способ легко настроить что-то подобное? Я хочу, чтобы не было необходимости изменять электронную почту в каждом публичном репо.
Разный .gitconfig для данного подкаталога?
Ответ 1
Реальный ответ заключается в том, что его невозможно.
Однако, благодаря @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="[email protected]"
else
export GIT_AUTHOR_EMAIL="[email protected]"
fi
cd "${@:-$HOME}" && ls;
}
Ответ 2
У меня такая же проблема. Как временное решение, у меня есть это в моем .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 будет лучше...
Ответ 3
Перейдя на 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="[email protected]"
export GIT_COMMITTER_EMAIL="[email protected]"
}
# configuration for profile 'fun':
chpwd_profile_fun()
{
[[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
print "chpwd(): Switching to profile: $profile"
export GIT_AUTHOR_EMAIL="[email protected]"
export GIT_COMMITTER_EMAIL="[email protected]"
}
# configuration for profile 'work':
chpwd_profile_work()
{
[[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
print "chpwd(): Switching to profile: $profile"
export GIT_AUTHOR_EMAIL="[email protected]"
export GIT_COMMITTER_EMAIL="[email protected]"
}
Ответ 4
У вас есть централизованный механизм создания репозиториев. Как и некоторые script на вашем пути и т.д., С помощью которых вы выполните:
repo create -t public -n name
или что-то в этом роде.
Команда repo (просто пример, который не имеет ничего общего с Android) позволит создать репо для вас в нужном месте и прочитать файл конфигурации и установить учетные данные для этого репо (в .git/config для это репо) на основе типа, открытого или закрытого и т.д.
Ответ 5
Как уже упоминалось в других ответах, вы не можете установить свои учетные данные для каждого каталога. Но 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 [email protected]
Ответ 6
У меня были такие же потребности, но я хотел, чтобы все секции .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 "[email protected]"
else
/usr/bin/git "[email protected]"
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 в зависимости от того, с каким репозиторием я играю.
Надеюсь, это поможет некоторым из вас.