Est-il possible de configurer user.name et utilisateur.email par domaines génériques dans.gitconfig?

J'ai un ordinateur de travail, et il est configuré globalement pour utiliser mon email de travail et mon nom lors de la validation. Que c'est bon. Cependant, je voudrais faire une sorte de règle qui dit: "si l'origine du repo est github, utilisez user X et email Y"

Je me rends compte que vous pouvez faire une entrée de configuration par référentiel, mais j'aimerais que ce soit plus automatique: si le clone est github, il devrait utiliser les détails de l'utilisateur github. Si je clone du travail, il devrait utiliser des détails de travail.

Est - il possible de configurer cela globalement basé sur le domaine distant? Manière ou d'une autre?

MODIFIER / METTRE À JOUR

J'ai accepté la réponse ci-dessous, mais j'ai légèrement modifié le script:

#!/usr/bin/env bash

# "Real" git is the second one returned by 'which'
REAL_GIT=$(which -a git | sed -n 2p)

# Does the remote "origin" point to GitHub?
if ("$REAL_GIT" remote -v 2>/dev/null | grep '^originb.*github.com.*(push)$' >/dev/null 2>&1); then

    # Yes.  Set username and email that you use on GitHub.
    export GIT_AUTHOR_NAME=$("$REAL_GIT" config --global user.ghname)
    export GIT_AUTHOR_EMAIL=$("$REAL_GIT" config --global user.ghemail)

fi

"$REAL_GIT" "$@"

L'addition principale est l'exigence de deux valeurs git config.

git config --global user.ghname "Your Name"
git config --global user.ghemail "you@yourmail.com"

Cela évite de coder en dur les valeurs dans le script, ce qui lui permet d'être plus portable. Peut-être?

24

5 réponses

Il n'y a rien intégré dans Git pour faire cela (pour autant que je sache), mais le script shell suivant semble fonctionner de manière assez fiable. Modifiez-le pour avoir le nom d'utilisateur et l'adresse e-mail que vous voulez lors de la vérification dans GitHub, puis enregistrez-le en tant qu'exécutable nommé "git" sur votre chemin quelque part avant Le "vrai" git.

#!/usr/bin/env bash

# "Real" git is the second one returned by 'which'
REAL_GIT=$(which -a git | sed -n 2p)

# Does the remote "origin" point to GitHub?
if ("$REAL_GIT" remote -v 2>/dev/null |
    grep '^origin\b.*github.com.*(push)$' >/dev/null 2>&1); then

    # Yes.  Set username and email that you use on GitHub.
    export GIT_AUTHOR_NAME='*** put your name here ***'
    export GIT_AUTHOR_EMAIL='*** put your email address here ***'

fi

"$REAL_GIT" "$@"

J'utilise une astuce similaire avec ssh sur ma machine -- je veux ssh pour modifier ma fenêtre couleur d'arrière-plan lorsqu'il s'exécute, puis changer de nouveau quand il sort -- et il a travaillé de manière fiable pour moi.

Notez également que ceci est codé en dur pour ne regarder que la télécommande nommée origin.

17
répondu Mike Morearty 2012-12-06 21:29:46

Git 2.13 ajoute la prise en charge de la configuration conditionnelle inclut. Si vous organisez vos caisses dans des répertoires pour chaque domaine de travail, vous pouvez ajouter des paramètres personnalisés en fonction de l'emplacement des caisses. Dans votre configuration git globale:

[includeIf "gitdir:code/work/"]
    path = /Users/self/code/work/.gitconfig

Puis dans ~/code/work/.gitconfig:

[user]
    email = self@work.com

Et bien sûr, vous pouvez le faire pour autant de domaines de travail comme vous le souhaitez.

10
répondu Jason R. Coombs 2017-09-15 12:24:31

J'ai écrit post-checkhout hook pour définir les détails de l'auteur local du dépôt en fonction de l'URL d'origine du dépôt.

Il ne fait pas de domaines génériques, bien qu'il utilise git config --urlmatch qui retombera prétendument à l'URL correspondante la plus proche.

Découvrez-le ici: https://github.com/boywhoroared/dotfiles/blob/master/git/template/hooks/post-checkout.d/author

5
répondu boywhoroared 2015-12-16 11:45:55

user.name et user.email sont utilisés pour "signer" vos commits. Puisque les commits sont indépendants des repo (par exemple, le même commit sera dans beaucoup de repos différents lorsque vous les pousserez), ces propriétés ne sont pas dépendantes à distance.

Ce que vous pouvez faire est de définir des journalisations différentes lors de la connexion à différentes télécommandes via https. Vous devez simplement mettre le nom d'utilisateur dans l'url, sous la forme https://username@host/path/to/repo.git et vous avez terminé.

Mais l'auteur du commit sera le même user.name, car les commits sont effectués localement, puis juste partagé avec les autres.

Comme l'identité du valideur fait partie de la validation, si vous effectuez deux validations identiques à l'exception du nom et de l'e-mail du valideur, ces validations auront des hachages différents, ce sera donc deux validations différentes pour git. Ce serait un gâchis :)

Si vous voulez vraiment faire cela, peut-être que vous pouvez faire quelque chose avec des crochets qui pousse vos commits vers un autre repo sur votre ordinateur, et cet autre repo (via des crochets, encore une fois) réécrira le commits, changer l'auteur, et pousser à l'autre télécommande.

Mais c'est tellement méchant que je nierai vous en avoir parlé;)

1
répondu mgarciaisaia 2012-12-06 19:28:56

Similaire à la réponse de Mike , mais grâce à la commande uniq à la quatrième ligne, cela n'entraînera pas de bombe à fourche, même si vous démarrez un shell à l'intérieur d'un shell.

#!/usr/bin/env bash

# "Real" git is the second one returned by 'which'
REAL_GIT=$(which -a git | uniq | sed -n 2p)

# Does the remote "origin" point to GitHub?
if ("$REAL_GIT" remote -v 2>/dev/null |
    grep '^origin\b.*github.com.*(push)$' >/dev/null 2>&1); then

    # Yes.  Set username and email that you use on GitHub.
    export GIT_AUTHOR_NAME='*** put your name here ***'
    export GIT_AUTHOR_EMAIL='*** put your email address here ***'

fi

"$REAL_GIT" "$@"
1
répondu Nicolas Raoul 2018-01-16 08:16:50