Après s'être inspiré de Article de blog d'Orr Sella J'ai écrit un hook pre-commit (résidant dans ~/.git/templates/hooks
) qui définirait des noms d'utilisateur et des adresses électroniques spécifiques sur la base des informations contenues dans la base de données des dépôts locaux. ./.git/config
:
Vous devez placer le chemin d'accès au répertoire du modèle dans votre fichier de configuration. ~/.gitconfig
:
[init]
templatedir = ~/.git/templates
Ensuite, chaque git init
o git clone
reprendra ce crochet et appliquera les données de l'utilisateur lors de la prochaine git commit
. Si vous voulez appliquer le crochet à des dépôts déjà existants, il suffit de lancer une commande git init
à l'intérieur du repo afin de le réinitialiser.
Voici l'accroche que j'ai trouvée (elle doit encore être peaufinée - les suggestions sont les bienvenues). Enregistrez-la soit comme
~/.git/templates/hooks/pre_commit
ou
~/.git/templates/hooks/post-checkout
et assurez-vous qu'il est exécutable : chmod +x ./post-checkout || chmod +x ./pre_commit
#!/usr/bin/env bash
# -------- USER CONFIG
# Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
git_remotes[0]="Github"
git_remotes[1]="Gitlab"
# Adjust names and e-mail addresses
local_id_0[0]="my_name_0"
local_id_0[1]="my_email_0"
local_id_1[0]="my_name_1"
local_id_1[1]="my_email_1"
local_fallback_id[0]="${local_id_0[0]}"
local_fallback_id[1]="${local_id_0[1]}"
# -------- FUNCTIONS
setIdentity()
{
local current_id local_id
current_id[0]="$(git config --get --local user.name)"
current_id[1]="$(git config --get --local user.email)"
local_id=("$@")
if [[ "${current_id[0]}" == "${local_id[0]}" &&
"${current_id[1]}" == "${local_id[1]}" ]]; then
printf " Local identity is:\n"
printf "» User: %s\n» Mail: %s\n\n" "${current_id[@]}"
else
printf "» User: %s\n» Mail: %s\n\n" "${local_id[@]}"
git config --local user.name "${local_id[0]}"
git config --local user.email "${local_id[1]}"
fi
return 0
}
# -------- IMPLEMENTATION
current_remote_url="$(git config --get --local remote.origin.url)"
if [[ "$current_remote_url" ]]; then
for service in "${git_remotes[@]}"; do
# Disable case sensitivity for regex matching
shopt -s nocasematch
if [[ "$current_remote_url" =~ $service ]]; then
case "$service" in
"${git_remotes[0]}" )
printf "\n»» An Intermission\n» %s repository found." "${git_remotes[0]}"
setIdentity "${local_id_0[@]}"
exit 0
;;
"${git_remotes[1]}" )
printf "\n»» An Intermission\n» %s repository found." "${git_remotes[1]}"
setIdentity "${local_id_1[@]}"
exit 0
;;
* )
printf "\n» pre-commit hook: unknown error\n» Quitting.\n"
exit 1
;;
esac
fi
done
else
printf "\n»» An Intermission\n» No remote repository set. Using local fallback identity:\n"
printf "» User: %s\n» Mail: %s\n\n" "${local_fallback_id[@]}"
# Get the user's attention for a second
sleep 1
git config --local user.name "${local_fallback_id[0]}"
git config --local user.email "${local_fallback_id[1]}"
fi
exit 0
EDITAR:
J'ai donc réécrit le hook comme un hook et une commande en Python. De plus, il est possible d'appeler le script comme une commande Git ( git passport
), également. Il est également possible de définir un nombre arbitraire d'IDs dans un fichier de configuration ( ~/.gitpassport
) qui sont sélectionnables sur une invite. Vous pouvez trouver le projet sur github.com : git-passport - Une commande et un hook Git écrits en Python pour gérer plusieurs comptes Git / identités d'utilisateur .
0 votes
Ver git-config#FILES .
1 votes
Je suis surpris que le serveur de votre entreprise fasse cela - il faudrait qu'il CHANGE le sha de votre commit pour que cela fonctionne. Si vous faites un commit sur un checkout local, quel nom d'utilisateur voyez-vous ?
0 votes
@Alex : On peut supposer que le crochet de notification essaie de faire correspondre les informations sur l'auteur (email, peut-être) avec une autre liste/base de données, peut-être pour la canoniser, peut-être pour rechercher d'autres informations. Il est évident que ce n'est pas la meilleure approche pour ce cas particulier, cependant !
1 votes
@Alex : J'ai oublié l'élément important - il pourrait facilement s'agir d'un nom sur la notification par courriel, sans que cela ne change quoi que ce soit sur le commit.
2 votes
Vous pouvez utiliser un git-hook pour automatiser ce travail récurrent : github.com/DrVanScott/git-clone-init
2 votes
Veuillez accepter cette réponse : stackoverflow.com/a/43654115/482899 . C'est la meilleure solution depuis git 2.13.
0 votes
Voir ma réponse ci-dessous
0 votes
Pourrait utiliser le modèle
[includeIf "gitdir:D:/workCode/**"]