2012-08-02 21 views
7

Sto tentando di creare un repository git per archiviare tutti i miei file dotfile e di configurazione. La mia idea era di creare semplicemente collegamenti fisici a tutti i file a cui tenevo e di archiviare tali collegamenti nella loro stessa directory che potrei trasformare in un repository.Can not Hard Link al file gitconfig

Ho colpito un po 'di difficoltà con il mio file ~/.gitconfig. Sembra che ogni volta che eseguo il comando 'git config' il link che ho creato non punti più alla giusta posizione, ad es. il file nel repository non si aggiorna più correttamente.

Ecco un esempio di shell e ruby ​​interattivo per determinare lo stato dei file collegati.

# Create the link 
$ ln .gitconfig .conf_files/gitconfig # Create the link 

# The files are in fact linked 
[1] pry(main)> File.identical?('.gitconfig', '.conf_files/gitconfig') 
=> true 

# Update the gitconfig file by running a 'git config' command 
$ git config --global alias.last 'log -1 HEAD' 

# The files are no longer linked. 
[2] pry(main)> File.identical?('.gitconfig', '.conf_files/gitconfig') 
=> false 

Presumo che questo abbia qualcosa a che fare con il modo in cui git sta scrivendo il file .gitconfig. Qualcuno sa perché questo potrebbe accadere o avere qualche idea creativa per una soluzione alternativa?

+1

git config interrompe collegamenti rigidi. Usa invece un link simbolico. –

+0

@William Pursell Correggimi se sbaglio, ma non credo che Git riconosca i collegamenti simbolici? –

+2

Inserisci il file effettivo nel repository git, quindi inserisci un link simbolico in $ HOME. git non vedrà mai il link soft. –

risposta

6

Prova la soluzione di Eli Barzilay nel suo commento al http://www.xxeo.com/archives/2010/02/16/dotfiles-in-git-finally-did-it.html:

Così ho finalmente trovato una soluzione che prende il meglio di entrambi: mettere il repo in una sottodirectory, e invece di link simbolici, aggiungere un opzione di configurazione per "core.worktree" per essere la vostra home directory. Ora quando sei nella tua directory di casa non sei in un repository git (quindi il primo problema è andato), e tu non hai bisogno di gestire i link simbolici fragili come nel secondo caso. Hai ancora avere il minor fastidio di escludere i percorsi che non vuoi essere versionati (ad esempio, il "*" nel trucco ".git/info/exclude"), ma non è nuovo.

+0

Funziona alla grande! Corregge il problema di ogni percorso riconosciuto come un repo git per i comandi git, evita i problemi di dover utilizzare collegamenti di qualsiasi tipo, E non è necessario ingombrare la radice del proprio file system. Ho semplicemente spostato il contenuto del file .gitignore nella mia risposta a ".conf_files/.git/info/exclude" e ha funzionato come un incantesimo. Grazie mille per questo! –

2

Questo è completamente normale ed è in effetti il ​​metodo consigliato per sovrascrivere i file di configurazione. Git crea un file temporaneo, scrive la configurazione e quindi sposta il nuovo file su quello vecchio. In questo modo, non si ottiene un file di configurazione incompleto (perdita di dati) se Git viene interrotto.

È sempre possibile scrivere uno script per copiare o collegare i file di configurazione nel proprio archivio centrale.

+0

Questo avrebbe senso per il motivo per cui gli hard link si interrompono, ma speravo che ci potesse essere un modo più semplice/pulito per mantenere identici i file. –

+0

@MattGarriott: Il vero problema qui è che stai provando a usare Git per tenere traccia dei file che * non possono * essere nel repository Git stesso. Questo è solo un limite fondamentale del modo in cui i filesystem sono progettati in questi giorni e del modo in cui Git è progettato. Considero uno script un modo "semplice e pulito" per farlo. Git è un mucchio di script comunque. L'alternativa è fare in modo che Git tenga traccia dei file al di fuori del suo repository - mentre ciò è tecnicamente possibile, è necessario conoscere il percorso che circonda l'impianto idraulico Git. –

+0

Hai assolutamente ragione, ed è per questo che ho deciso di affrontare questo problema da una prospettiva diversa, ho allegato la mia nuova soluzione come risposta a questa domanda. Grazie per tutte le tue spiegazioni e aiuto! –

0

Checkout questa risposta, forse può essere di aiuto:

https://stackoverflow.com/a/3731139/1431696

Nel frattempo, hai pensato di fare i collegamenti in senso inverso? Crea il tuo repository pieno di file di configurazione, ecc. E poi, nel posto in cui usi effettivamente i tuoi file, crea un collegamento fisico al file 'reale', che si trova nel repository.

+6

Gli hard link sono simmetrici. Non vanno al contrario perché non vanno avanti in avanti. –

+0

Ah che sembra essere un po 'difficile. – wardd

0

Grazie alla risposta e il consiglio di Dietrich Epp io abbiamo deciso di affrontare questo problema da una prospettiva diversa, creando il repository alla radice del mio file system, e l'utilizzo di .gitignore per monitorare solo i file che mi interessano.

il mio file .gitignore ora assomiglia a questo:

/* 

!/etc/ 
/etc/* 

# etc files 
!/etc/rc.conf 
!/etc/asound.conf 
!/etc/mercurial/ 

!/home/ 
!/home/matt/ 
/home/matt/* 

# Home files 
!/home/matt/.xinitrc 
!/home/matt/.gitconfig 
!/home/matt/.bashrc 

# Vim files 
!/home/matt/.vimrc 
!/home/matt/.vim/ 
.netrwhist 

Oltre a non dover copiare i file separatamente e tenerli in due luoghi separati questo ha il vantaggio che avrei bisogno posso ripristinare facilmente i cambiamenti senza dover per copiare manualmente i file pure.

Grazie per l'aiuto ragazzi!

Problemi correlati