È possibile includere un file nel tuo .gitconfig


245

Vorrei includere un file nel mio .gitconfig con le mie impostazioni github - è possibile?

Posso fare qualcosa del genere:

[core]
    include = /path/to/file

3
"Non voglio includere i dettagli di github al suo interno, quindi perché vorrei includerli in qualche modo da un file esterno": questo è esattamente lo scopo del file di configurazione globale. C'è qualche motivo per non usarlo nel tuo caso?
VonC,

11
Sì, perché voglio pubblicare .gitconfig in un repository git e non voglio che qualcuno rubi le mie credenziali di github.
David Reynolds,

Non ti seguo: il tuo normale file gitconfig verrà pubblicato su github, ma senza alcuna impostazione di github. Perché? Perché quelli sarebbero nel tuo file di configurazione globale ( ~/.gitconfig), cioè non inviati al tuo repository github. Quando digiti ' git config', ciò che vedi è la concatenazione del file di configurazione 3 (repo, globale e di sistema). Viene inviato solo il file di configurazione repo. Gli altri 2 rimangono locali.
VonC,

90
sembra che tutti abbiano perso il punto di questa domanda. David ovviamente vuole fare il push di un repository di tutti i suoi file dot (bashrc, gemrc, ecc.) COMPRESO il suo .gitconfig in modo da poter avere tutte le sue impostazioni su tutte le sue macchine. Un modo per spingere parti di un file .gitconfig includendo e ignorando le voci private è ciò che lui (e io, per quella materia) è dopo
Bo Jeanes,

5
@bjeanes: appunto! Tuttavia non ho ancora trovato il modo di farlo.
David Reynolds,

Risposte:


302

Git (1.7.10+) ora supporta questa sintassi in .gitconfig:

[include]
    path = /path/to/file

Vedi qui per una descrizione dettagliata del cambio git e dei suoi casi limite.

A proposito, un paio di sottigliezze che vale la pena sottolineare:

  1. L'espansione variabile d'ambiente, ad esempio $HOME, non è supportata. (Espansione di ~apparso in Git 1.7.10.2.)

  2. Se viene specificato un percorso relativo, è relativo al file .gitconfig con l' [include]istruzione. Funziona correttamente anche con inclusioni concatenate, ad esempio ~/.gitconfigpuò avere:

    [include]
        path = subdir/gitconfig
    

    e subdir/gitconfigpuò avere:

    [include]
        path = nested_subdir/gitconfig
    

    ... che causerà il subdir/nested_subdir/gitconfigcaricamento.

  3. Se git non riesce a trovare il file di destinazione, ignora silenziosamente l'errore. Questo sembra essere di progettazione.


7
in realtà non hai bisogno ~. questo perché il tuo file .gitconfig deve ancora risiedere in ~/.gitconfigun percorso relativo nella configurazione implicherebbe ~...
robustus,

2
L' espansione ~/ $HOMEè in realtà a partire da git describe --contains 4c0a89fc-> v1.7.10.2~12^2(ovvero v1.7.10.2o successivamente), notevole come sembra che Debian 7 e Ubuntu Quantal rilasceranno con v1.7.10.4.
FauxFaux,

1
Questo supporta globs? ad es. percorso = ~ / gitconfig.d / *?
Bret,

1
@Bret no, questo non supporta globs.
Mike Morearty,

8
Si noti che le configurazioni incluse in questo modo non verranno visualizzate quando viene fornito un file specifico (ovvero, con --global, --localo --file), a meno che non sia esplicitamente indicato con --includes(come git config --global --includes --list).
Franklin Yu,

16

Aggiornamento 2012:

Vedi la risposta di Mike Morearty :

include

È possibile includere un file di configurazione da un altro impostando la include.pathvariabile speciale sul nome del file da includere.
Il file incluso viene espanso immediatamente, come se il suo contenuto fosse stato trovato nella posizione della direttiva include.
Se il valore della include.pathvariabile è un percorso relativo, il percorso viene considerato relativo al file di configurazione in cui è stata trovata la direttiva include.
Il valore di include.pathè soggetto all'espansione tilde: ~/viene espanso al valore di $HOMEe ~user/nella home directory dell'utente specificato.


Non la penso così.

Preferirei inserire questa impostazione nel ~/.gitconfigfile

File di configurazione specifico dell'utente. Chiamato anche file di configurazione "globale".

In questo modo, completa il file specifico del progetto .gitconfig, senza essere pubblicato quando viene inviato a GitHub. Vedi anche questa risposta SO per ulteriori informazioni sul file di configurazione globale.
Git ha 3 file di configurazione .


bjeanes aggiunge nei commenti:

sembra che tutti abbiano perso il punto di questa domanda.
David vuole, ovviamente, a spingere una repo di tutti i suoi file punto ( bashrc, gemrc, etc.) tra cui il suo .gitconfig, così da poter avere tutti i suoi impostazioni di tutte le sue macchine.
Un modo per spingere parti di un .gitconfigfile includendo e ignorando le voci private è quello che lui (e io, per quella materia) sta cercando.

Un modo possibile sarebbe quello di utilizzare un driver di filtro smudge / clean per decrittografare / crittografare un file con informazioni riservate private (vedere questo thread ), al fine di completare un file locale come ~ / .gitconfig con le parti decodificate che sono rilevanti per quello file.

In questo modo puoi avere un repository Git con tutti i tuoi file dot, oltre a un file con informazioni crittografate pensato per essere decrittografato e aggiunto a detti file dot.

testo alternativo

In .gitattributes(o .git/info/a..) utilizzare:

myPrivateInfosFile filter=gpg diff=gpg

Nel file .config del repository:

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

(una soluzione basata su GPG significa, ovviamente, che hai comunicato le tue chiavi pubbliche / private con un altro mezzo sul computer di destinazione in cui desideri ripristinare tutti i tuoi file dot clonando questo repository speciale)

In realtà, nel tuo caso, lo script smudge deve essere completato come deve, dopo aver decrittografato quel file, andare avanti e aggiungere parti pertinenti al tuo ~/.gitconfigfile globale (a meno che non sovrascrivi il file di configurazione globale con un'altra posizione ) o altri file di punti per quello importa.

https://kerneltrap.org/mailarchive/git/2008/3/13/1153274/thread (gli inconvenienti di gpg sono discussi ulteriormente in questo thread ) (questo è diverso dall'avere un repository Git completamente codificato, come discusso qui )


5
Voglio pubblicare il mio file .gitconfig di base in un repository git, ma non voglio includere i dettagli di github in esso, quindi perché vorrei includerli in qualche modo da un file esterno.
David Reynolds,

10

Puoi caricarlo dalla riga di comando:

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

Utilizzare "$PWD"/.gitconfiginvece, se si desidera caricare il file dalla directory corrente.

Dopo aver eseguito il comando sopra, le seguenti righe vengono aggiunte al tuo .git/configfile:

[include]
        path = /path/to/.gitconfig

2

Credo che tu possa ottenere questo risultato usando lo strumento hub di defunkt . Questo è un wrapper per il comando git che tra le altre cose, consente di avere GITHUB_USERe GITHUB_TOKENvariabili d'ambiente. Che sovrascriverà le impostazioni nel .gitconfigfile locale .

Quindi, per semplificare l'utente che hai indicato alias alias git=hubnella sua configurazione ZSH . Dovresti quindi essere in grado di creare un file locale in cui impostare le variabili di ambiente e spingere il tuo repository nel mondo pubblico con tutte le tue informazioni private in contatto.

** NOTA per gli utenti homebrew su OSX, è possibile installare lo strumento tramite brew install hub.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.