2012-06-04 15 views
34

Voglio escludere automaticamente 2 file dal commit, che fanno parte del repository git ma hanno alcune modifiche, che non dovrebbero essere parte del repository github, perché hanno alcune modifiche che sono significativi solo per il mio sistema locale e non per gli altri sviluppatori.git non ignora 2 file specificatamente denominati

li ho aggiunti .git/info/exclude nella speranza git capisce che lui non dovrebbe impegnarsi modifiche a loro:

# git ls-files --others --exclude-from=.git/info/exclude 
# Lines that start with '#' are comments. 
# For a project mostly in C, the following would be a good set of 
# exclude patterns (uncomment them if you want to use them): 
# *.[oa] 
a.conf 
b.conf 
# *~ 

ma git status li elenca ancora come messa in scena per la commissione:

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: build/conf/a.conf 
# modified: build/conf/b.conf 
# 

I don Non voglio fermarli regolarmente con ogni commit (una volta potrei semplicemente dimenticarlo), come posso farlo?

+2

Perché non a '.gitignore'? – maverik

+5

Non è possibile ignorare i file che si stanno tracciando. Probabilmente hai bisogno di trovare un altro modo per gestire le informazioni specifiche del sistema locale, come ad esempio avere file "modello" da cui generi o modifica manualmente i file di configurazione. –

+2

@maverik: se "exclude" non funziona, anche ".gitignore" non funzionerà. Il caso d'uso per "exclude" è che questa informazione è localmente mentre ".gitignore" potrebbe essere archiviato e condiviso. Prendi "exclude" per le tue cose locali quando non vuoi far esplodere il ".gitignore". Immagina un grande progetto in cui ogni sviluppatore inserisce le sue esclusioni in '.gitignore'. Non sarebbe più gestibile ... – eckes

risposta

92

Ciò che si desidera è ignorare le modifiche sui file rilevati. Questo non può essere raggiunto (come Charles Baileysays) correttamente, né con .gitignore né con .git/info/exclude.

Avrete bisogno di usare git update-index:

git update-index --assume-unchanged build/conf/a.conf 
git update-index --assume-unchanged build/conf/b.conf 

vi ottenere quello che vuoi: i file sono sempre assunti invariato.

Se si desidera tenere traccia delle modifiche in questi file, utilizzare --no-assume-unchanged.

Infine, se volete sapere quali file sono attualmente in modalità --assume-unchanged, chiedere git per

git ls-files -v | grep -e "^[hsmrck]" 
+0

Funziona alla grande per me! – Gustyn

+1

Ottengo 'fatale: impossibile contrassegnare il file {percorso/su/file}' – Leo

+0

questa soluzione è legata a un ramo? Diamo il file1 e il file 2 contrassegnato come "assume-invariato" in branch1. Quindi checkout a branch2. Anche questi file sono contrassegnati come "assumi-invariati"? – nespapu