Est-il possible d'inclure un fichier dans votre .gitconfig

245

Je voudrais inclure un fichier dans mon .gitconfig qui a mes paramètres github - est-ce possible?

Puis-je faire quelque chose comme ça:

[core]
    include = /path/to/file
David Reynolds
la source
3
"Je ne veux pas y inclure les détails du github, d'où la raison pour laquelle je voudrais les inclure à partir d'un fichier externe": c'est précisément à cela que sert le fichier de configuration global. Y a-t-il une raison de ne pas l'utiliser dans votre cas?
VonC
11
Oui, car je veux publier le .gitconfig dans un référentiel git et je ne veux pas que quelqu'un vole mes informations d'identification github.
David Reynolds
Je ne vous suis pas: votre fichier gitconfig habituel sera publié sur github, mais sans aucun paramètre github. Pourquoi? Parce que ceux-ci seraient dans votre fichier de configuration global ( ~/.gitconfig), c'est-à-dire non poussés vers votre dépôt github. Lorsque vous tapez ' git config', vous voyez la concaténation du fichier de configuration 3 (repo, global et system). Seul le fichier de configuration de repo est poussé. Les 2 autres restent locaux.
VonC
90
il semble que tout le monde a raté le point de cette question. David veut évidemment pousser vers le haut un dépôt de tous ses fichiers dot (bashrc, gemrc, etc.) INCLUANT son .gitconfig afin qu'il puisse avoir tous ses paramètres sur toutes ses machines. Une façon de pousser des parties d'un fichier .gitconfig en incluant et en ignorant les entrées privées est ce qu'il (et moi, d'ailleurs) est après
Bo Jeanes
5
@bjeanes: précisément! Je n'ai toujours pas trouvé de moyen de le faire.
David Reynolds

Réponses:

302

Git (1.7.10+) prend désormais en charge cette syntaxe dans .gitconfig:

[include]
    path = /path/to/file

Voir ici pour une description détaillée du changement de git et de ses cas de bord.

Soit dit en passant, quelques subtilités méritent d'être soulignées:

  1. L'extension à variable d'environnement, par exemple $HOME, n'est pas prise en charge. (Expansion de ~apparu dans Git 1.7.10.2.)

  2. Si un chemin relatif est spécifié, il est relatif au fichier .gitconfig qui contient l' [include]instruction. Cela fonctionne correctement même entre les chaînes chaînées - par exemple, ~/.gitconfigpeut avoir:

    [include]
        path = subdir/gitconfig
    

    et subdir/gitconfigpeut avoir:

    [include]
        path = nested_subdir/gitconfig
    

    ... ce qui entraînera subdir/nested_subdir/gitconfigle chargement.

  3. Si git ne trouve pas le fichier cible, il ignore silencieusement l'erreur. Cela semble être par conception.

Mike Morearty
la source
7
en fait, vous n'avez pas besoin ~. c'est parce que votre fichier .gitconfig doit encore résider dans ~/.gitconfigun chemin relatif dans la configuration impliquerait ~...
robustus
2
L' extension ~/ $HOMEest en fait à partir de git describe --contains 4c0a89fc-> v1.7.10.2~12^2(c'est-à v1.7.10.2- dire ou plus tard), notable car il semble que Debian 7 et Ubuntu Quantal sortiront avec v1.7.10.4.
FauxFaux
1
Est-ce que cela prend en charge les globes? par exemple path = ~ / gitconfig.d / *?
Bret
1
@Bret non, cela ne prend pas en charge les globes.
Mike Morearty
8
Notez que les configurations incluses de cette façon ne sera pas affiché lorsqu'un fichier spécifique est donnée (qui est, avec --global, --localou --file), à moins que dit explicitement --includes(comme git config --global --includes --list).
Franklin Yu
16

Mise à jour 2012:

Voir Mike Morearty de » réponse :

Comprend

Vous pouvez inclure un fichier de configuration d'un autre en définissant la include.pathvariable spéciale sur le nom du fichier à inclure.
Le fichier inclus est immédiatement développé, comme si son contenu avait été trouvé à l'emplacement de la directive include.
Si la valeur de la include.pathvariable est un chemin relatif, le chemin est considéré comme relatif au fichier de configuration dans lequel la directive include a été trouvée.
La valeur de include.pathest soumise à l'expansion du tilde: ~/est étendue à la valeur de $HOMEet ~user/au répertoire de base de l'utilisateur spécifié.


Je ne pense pas.

Je préfère mettre ce paramètre dans le ~/.gitconfigfichier

Fichier de configuration spécifique à l'utilisateur. Aussi appelé fichier de configuration "global".

De cette façon, il complète le fichier spécifique au projet .gitconfig, sans être publié lorsqu'il est poussé vers GitHub. Voir également cette réponse SO pour plus d'informations sur le fichier de configuration global.
Git a 3 fichiers de configuration .


bjeanes ajoute dans les commentaires:

il semble que tout le monde a raté le point de cette question.
David veut évidemment pousser un repo de tous ses fichiers de points ( bashrc, gemrc, etc.) dont son .gitconfigafin qu'il puisse avoir tous ses paramètres sur toutes ses machines.
Un moyen de pousser des parties d'un .gitconfigfichier en incluant et en ignorant les entrées privées est ce qu'il (et moi, d'ailleurs) est après.

Un moyen possible serait d'utiliser un pilote de filtre de nettoyage / nettoyage pour décrypter / crypter un fichier avec des informations sensibles privées (voir ce fil ), afin de compléter un fichier local comme ~ / .gitconfig avec les parties décryptées qui sont pertinentes pour cela fichier.

De cette façon, vous pouvez avoir un dépôt Git avec tous vos fichiers dot, plus un fichier avec des informations cryptées destinées à être décryptées et ajoutées auxdits fichiers dot.

texte alternatif

En .gitattributes(ou .git/info/a..) utilisation:

myPrivateInfosFile filter=gpg diff=gpg

Dans votre fichier repo .config:

[filter "gpg"]
smudge = gpg -d -q --batch --no-tty
clean = gpg -ea -q --batch --no-tty -r C920A124
[diff "gpg"]
textconv = decrypt

(une solution basée sur GPG signifie, bien sûr, que vous avez communiqué vos clés privées / publiques par un autre moyen sur l'ordinateur de destination où vous souhaitez restaurer tous vos fichiers dot en clonant ce dépôt spécial)

En fait, dans votre cas, le script de maculage doit être terminé car il doit, après avoir déchiffré ce fichier, continuer et ajouter des parties pertinentes à votre ~/.gitconfigfichier global (sauf si vous écrasez le fichier de configuration global avec un autre emplacement ) ou d'autres fichiers dot pour cela matière.

https://kerneltrap.org/mailarchive/git/2008/3/13/1153274/thread (les inconvénients gpg sont discutés plus loin dans ce fil ) (cela est différent que d'avoir un dépôt Git crypté complet, comme discuté ici )

VonC
la source
5
Je veux publier mon fichier .gitconfig de base dans un référentiel git, mais je ne veux pas y inclure les détails de github, d'où la raison pour laquelle je voudrais les inclure à partir d'un fichier externe.
David Reynolds
10

Vous pouvez le charger depuis la ligne de commande:

$ git config --local include.path "/path/to/.gitconfig"

Utilisez à la "$PWD"/.gitconfigplace, si vous souhaitez charger le fichier à partir du répertoire en cours.

Après avoir exécuté la commande ci-dessus, les lignes suivantes sont ajoutées dans votre .git/configfichier:

[include]
        path = /path/to/.gitconfig
Kenorb
la source
2

Je pense que vous pouvez accomplir cela en utilisant l'outil hub de defunkt . Ceci est une enveloppe pour la commande git qui , entre autres choses, vous permet d'avoir GITHUB_USERet GITHUB_TOKENvariables d'environnement. Qui remplacera les paramètres dans le local.gitconfig fichier .

Ensuite, pour rendre transparente l'utilisateur que vous avez souligné alias git=hubdans sa configuration ZSH . Vous devriez pouvoir ensuite source un fichier local où vous définissez vos variables d'environnement et pousser votre référentiel vers le monde public avec toutes vos informations privées en contact.

** REMARQUE pour les utilisateurs homebrew sur OSX, vous pouvez installer l'outil via brew install hub.

Geoff Lanotte
la source