2011-12-28 18 views
41

Questa domanda è stata visualizzata in forme simili here e here, ma non sembrano corrispondere a quello che sto cercando.Dire a git di ignorare i collegamenti simbolici

Sto realizzando un progetto in StaticMatic, un generatore di siti statici Ruby. Fondamentalmente, è solo una directory src/con i modelli Haml, Sass e CoffeeScript. StaticMatic fornisce un server di sviluppo per continuare a compilarli in un sito statico, nonché un comando di generazione che genera il sito statico in build /.

La mia modifica a StaticMatic è di consentire l'aggiunta di src/_modules/foo /, che potrebbe contenere src/_modules/foo/bar.haml. Quando si esegue il server o si costruisce il sito, viene creato un collegamento simbolico su src/bar.haml che punta al file in foo /.

Fin qui tutto bene. (I conflitti vengono gestiti, ecc.)

Il ragionamento alla base di directory separate in _modules/è che potrebbero essere tracciati come sottomoduli git e verificati in modo indipendente da altri team. In sostanza, questo consente a più team di lavorare su pagine diverse (in realtà app JS) in un unico sito statico senza duplicare il layout principale e così via.

L'intoppo è che git vuole pensare a questi symlink come file. Per esempio, git status mostra:

# On branch master 
# Untracked files: 
# (use "git add <file>..." to include in what will be commited) 
# 
#  src/_modules/bar/foo.haml 
#  src/foo.haml 

... quando ho davvero voglia per mostrare src/_modules/bar/foo.haml e di ignorare src/foo.haml

Un approccio potrebbe essere quello di avere il mio codice di collegamento generatrice di aggiungere i collegamenti per .gitignore , ma scherzare con .gitignore a livello di codice mi sembra incline all'errore. (Forse questa preoccupazione non è ragionevole?)

mio fix ideale sarebbe qualcosa di simile:

[filetype = link] 

... in .gitignore. Per quanto ne so, niente di simile è possibile, o è vero?

+1

"L'intoppo è che git vuole pensare a questi symlink come file." Non è vero, vuole solo rintracciarli come collegamenti simbolici. Non sono sicuro di capire perché non vuoi monitorare i collegamenti simbolici, sembra che siano una parte importante della struttura del sito. –

+1

Ah, grazie per i chiarimenti. Ma ancora, i collegamenti simbolici non sono una parte importante di nulla, sono solo pensati per essere una colla temporanea in modo che il server di sviluppo e il processo di costruzione li considerino come appartenenti alla directory principale/src. I collegamenti simbolici vengono ricreati ogni volta che viene avviato il server o viene creata una build. – user225643

+0

(Inoltre, il motivo per cui non li voglio è che potrebbe voler lavorare su una parte del sito senza preoccuparsi che un modulo sia stato estratto o aggiornato.) – user225643

risposta

17

A seconda della versione di git che si sta utilizzando dovrebbe seguire i collegamenti simbolici. C'è un'impostazione di configurazione di core.symlinks, che può essere impostata su false e quindi non lasciare che git li segua come directory (assumendo git> = 1.6). Sembra del tutto ragionevole che il tuo script di symlink aggiunga anche questi link al file .gitignore o semplicemente li aggiungi tu stesso. Si potrebbe anche fare una cosa del genere find . -type l >> .gitignore

+2

'git config core.symlinks false' (per coloro che sfiorano la lettura). Ma tieni presente che questo controlla i link simbolici come file di testo, la cui destinazione potrebbe non essere valida sul sistema di un altro utente. – JellicleCat

19

Questo sembra essere un'idea migliore

find . -type l | sed -e s'/^\.\///g' >> .gitignore 

Find emette un "./" prefisso per tutti i file. A meno che non lo tagli, Gitignore non è in grado di agire su di loro. . "\" Una volta che si taglia l'all'inizio, funziona come un fascino

+8

Non c'è bisogno di sed. Sostituisci '.' con' * ':' find * -type l >> .gitignore' – nickptrvc

+0

trova i link in formato ./ che confondono gitignore. Il sed toglie il ./ dall'inizio dei risultati –

+1

@ Biswajit_86 'find .' antepone'./'Ma' find * 'non lo fa. Penso che sia quello che sta dicendo @nickptrvc. Non so se tutto il resto rimarrà lo stesso, ma sembra così a prima vista. – Mark

2

La mia risposta da another question è rilevante:

for f in $(git status --porcelain | grep '^??' | sed 's/^?? //'); do 
    test -L "$f" && echo $f >> .gitignore; 
    test -d "$f" && echo $f\* >> .gitignore; 
done 
0

non mantengo gli eseguibili, ed i collegamenti simbolici nel mio repository .. Quindi voglio ometterli anche quando faccio uno "stato git".

Se, come me, si desidera ignorare i collegamenti simbolici, le directory e gli eseguibili (ad alcuni dei file in $ NAG_HOME/libexec è possibile aggiungere tali file.gitignore come segue:

file * | egrep 'ELF|symbolic|directory' | awk -F\: '{ print $1 }' >> .gitignore 

    echo ".gitignore" >> .gitignore 

Poi, quando si esegue un git status, non sputare indietro l'elenco di tali file se non vengono aggiunti al repository.

7

Abbiamo avuto un problema simile dove abbiamo bisogno di ignorare una directory link simbolico o una directory reale, ma non una sottodirectory con lo stesso nome o un file che inizia con le stesse lettere. Per esempio:

  • Ignore - (link simbolico) ./media
  • Ignore - (directory) ./media
  • Non ignorare - ./something/media
  • Non ignorare - ./media .bak
  • non ignorare - ./media-somethingelse

ho finito per usare questo nella .gitignore:

media 
!*/media 

che sembra un po 'strano, ma è sostanzialmente dicendo (linea 1) ignorare tutto "media", ma (linea 2) non ignorare tutto ciò "media" che non si trova nella directory principale. Questo metodo richiede una piccola specificità (per non ignorare le cose nelle sottodirectory), ma dovrebbe essere abbastanza facile da adattare/estendere.

+4

Si può semplicemente fare '/ media'. I percorsi assoluti si riferiscono alla directory contenente il file gitignore. – Zenexer

+0

@Zenexer, questo ha funzionato perfettamente per me grazie !!! – Jake

-1

La mia soluzione potrebbe sembrare sciocca, ma preferirei farlo piuttosto che aggiornare il file .gitignore ogni volta che viene aggiunto un nuovo file.

mi limito a lasciare i legami con un nome di default come "Link a xxx" e quindi aggiungere la seguente riga al mio file .gitignore:

link to * 

Poi basta assicurarsi di non nominare qualsiasi altro file/cartelle con un nome che inizia con "link to" e sei ordinato.

+1

ma poi dovremmo rifare l'intero progetto per fare riferimento a tutti i link simbolici come "link \ to \ original_name", no grazie! – pythonian29033

+0

Beh, è ​​sicuramente un approccio al di fuori del "pensare". Ho apprezzato l'ispirazione. – kkahl

Problemi correlati