2013-03-17 15 views
59

Qual è il modo corretto di gestire i collegamenti simbolici in git?Git - come gestire i symlink

Ho la seguente struttura:

Vendors 
    Module A 
    Module B 
    Module C 
App 
Code 
    Modules 
    Core Module 1 
    Core Module 2 
    Module A (symlinked to vendors) 
    Module B (symlinked to vendors) 
    Module C (symlinked to vendors) 

C'è un una directory principale App che contiene tutto il codice di base nell'applicazione. Inoltre c'è una directory del fornitore che contiene i moduli che ottengono collegamenti simbolici nella directory principale dell'app e quindi integrati.

Importante: sia la directory del fornitore che la directory dell'app principale sono entrambe con versioni nello stesso repository.

Pertanto, dovrei lasciare che git continui a memorizzare i collegamenti simbolici o trovare un modo per farlo ignorare i collegamenti simbolici?

+0

hm L'ho reso relativo e non funziona su github :(puoi aiutarmi? Https://github.com/lingohub/Example-Resource-Files/blob/master/AngularJS/example.en.json –

risposta

117

Git può gestire i collegamenti simbolici finchè il sistema operativo utilizzato da tutti gli sviluppatori li supporta. Dato che dipendi dall'avere presente questi collegamenti simbolici, suppongo che tutti i tuoi ambienti di sviluppo supportino i collegamenti simbolici.

per decidere se qualcosa dovrebbe essere incluso nel proprio repository git o no (link simbolico o in altro modo) Si consideri il seguente:

  • Si tratta di un file generato da qualche strumento o un altro processo nel repository? Se è così, è meglio ignorarlo e lasciare che ogni utente generi il file, in modo che abbia sempre la versione più recente.
  • Il file è specifico per l'ambiente di sviluppo di un particolare utente o è utilizzato in tutti gli ambienti? Se è una stranezza dell'ambiente di un particolare utente, come una configurazione per ignorare i file di backup di Emacs, non appartiene al repository. Se è qualcosa di cui tutti gli sviluppatori avranno bisogno e/o qualcosa che è necessario per costruire l'applicazione per la produzione, dovrebbe andare nel repository.

Nel tuo caso sembra che i collegamenti simbolici non siano generati e siano necessari in tutti gli ambienti, quindi inserirli nel repository dovrebbe andare bene.

Tuttavia, durante la loro creazione assicurarsi di crearli come collegamenti simbolici relativi piuttosto che collegamenti simbolici assoluti, in modo che funzionino indipendentemente da dove il repository è clonato. Il modo più semplice per farlo è quello di cambiare directory nella directory dei moduli e creare il link simbolico da lì:

cd App/Code/Modules 
ln -s "../../../Vendors/Module A" "Module A" 
+40

+1 per evidenziare "symlink relativi" –

+0

hm L'ho reso relativo e non funziona su github :(puoi aiutarmi per favore? Https://github.com/lingohub/Example-Resource-Files/blob/master/ AngularJS/example.en.json –

+0

Significa che se applico qualche cambiamento nei Vendor/Modulo A, e lo spingo a Git, Git aggiornerà automaticamente i contenuti di App/Code/Modules/Module A? – HasnainMamdani

8

Git memorizza il collegamento simbolico, proprio come qualsiasi altro file nel suo controllo di versione - tranne per un link simbolico, memorizzerebbe solo le informazioni sul percorso a cui è collegato simbolicamente e il tipo di file come link simbolico invece di un file normale.

Se il collegamento simbolico punta a una directory, git non memorizza i contenuti nella directory con collegamenti simbolici.

Quindi non ci dovrebbe essere alcun danno nella memorizzazione di collegamenti simbolici sotto git per il tuo caso.

Un'altra cosa che devi sapere con i collegamenti simbolici è che, git, ricrea solo i collegamenti simbolici su un nuovo clone, non il file o la directory a cui punta. Ci sono possibilità che il percorso con collegamenti simbolici sia inesistente (ad esempio quando si utilizzano percorsi assoluti).

+0

C'è un modo per aggiungere file che si trovano in una directory symlink? – kraftydevil

+0

@kraftydevil - git ti permetterà di aggiungere file sotto la directory symlink solo fino a quando la directory di destinazione del link simbolico stesso è sotto controllo versione git. (e non dovrebbe) versione del contenuto della directory symlink Se stai provando a eseguire i file di versione sotto la directory symlink al di fuori della directory principale del repository git, allora stai facendo qualcosa di sbagliato. Potresti voler controllare 'git submodules '(o meglio' git subtrees'). – Tuxdude

+0

Sto mettendo la mia istanza di Jenkins sotto il controllo del codice sorgente.Vorrei conservare l'ultimo contenuto di build riuscito per ogni lavoro. affronta un po 'più tardi per ulteriori spiegazioni. – kraftydevil

1

@Tuxdude Non sono d'accordo con te a tutti con" ... allora stai facendo qualcosa di sbagliato ". Ad esempio, se è necessario posizionare una cartella multimediale su una diversa unità sul server web o anche su un NFS, è necessario metterla al di fuori del controllo della versione.Quindi i contenuti all'interno della cartella multimediale con collegamenti simbolici non saranno accessibili tramite il controllo delle versioni come spiegato. Ma questo è uno scenario in cui devi farlo in quel modo. Ed è davvero un dolore in b ... Il mio scenario è ancora più complesso (non entrerò nei dettagli), quello che cerco in realtà è aggiungere le sottocartelle della cartella con collegamenti simbolici alla versione ma non ai suoi contenuti, ma Ho bisogno di avere un'opzione dove posso ignorare eventuali modifiche del tipo di sottocartella stesso in git. A titolo di esempio, la struttura di base:

  • app/media/bla
  • app/media/blubb

ho bisogno di queste cartelle nel controllo delle versioni git, senza i suoi contenuti.

Sul server web (lo stesso delle versioni) quelle cartelle simile a questa (link simbolici):

  • app/media/bla => da qualche parte del tutto altra
  • app/media/blubb => da qualche parte tutto il resto di nuovo

Gli sviluppatori dovrebbero avere sul proprio ambiente locale solo la struttura con versione originale come spiegato nel primo passaggio (nessun collegamento simbolico). Ma il server web ha collegamenti simbolici a diversi sistemi NFS.

Se qualcuno ha un'idea su come risolverlo, lo apprezzerei molto, perché non ho ancora trovato alcuna soluzione.

L'unico modo in cui lo sto facendo ora è avere un builder che crei la struttura corretta/diversa per gli ambienti locali e i server e le sottocartelle dei supporti siano attualmente ignorati interamente da gitignore. Ma a volte può essere difficile/difficile da mantenere.

+0

Questo è un problema comune e, come ho detto prima, non è correlato al controllo della versione: una soluzione consiste nell'avere uno script di inizializzazione per configurare i collegamenti simbolici in base all'ambiente di destinazione. p il tuo setup subito dopo un 'git clone'. Aggiungi lo script di inizializzazione nel controllo della versione di git.BTW 'git' non eseguirà la versione delle directory vuote, git solo i file delle versioni e conosce il percorso. Questo sarà usato per ricreare la struttura della directory quando si esegue uno dei comandi 'git'. – Tuxdude

+0

Grazie per la tua spiegazione, questo in realtà è esattamente come lo faccio nelle mie attuali configurazioni. Ho solo pensato che ci sarebbe potuto essere un modo più "comodo". Se git avesse una specie di flag di differenziazione tra file normali e symlink nelle regole gitignore, ecc., Allora alcune cose sarebbero almeno un po 'più semplici. Ecco perché penso che ci sia una relazione con il "controllo di versione", potrebbe essere implementato come una "nuova funzionalità"/attraverso una richiesta di funzionalità, ci sono anche altre cose che mi mancano in git, anche quando si tratta di più complessi scenari. – ioCron

+0

Posso effettivamente dire perché git tratta i collegamenti simbolici in questo modo. Per git, symlink è equivalente a un file di testo il cui contenuto rappresenta la destinazione del collegamento simbolico. Questo target viene aggiunto come parte della cronologia di git quando aggiungi il link simbolico a git. – Tuxdude