git update-index --assume-unchanged sulla directory


101

git 1.7.12

Voglio contrassegnare tutti i file al di sotto di una data directory come presumibilmente invariati.

1) git update-index --assume-unchaged dir/restituisce "Ignora percorso".

2) git update-index --assume-unchaged dir/*fallisce rapidamente perché incontrerà file che non vengono tracciati, quindi dà "fatal: Unable to mark file" e si chiude.

3) Prova a generare un elenco di file da contrassegnare. cdnella directory desiderata e quindi eseguire git ls-files | tr '\n' ' ' | git update-index --assume-unchanged. Ciò non produce alcun messaggio di errore, ma non contrassegna correttamente i file. La prima parte del comando git ls-files | tr '\n' ' ',, produce correttamente un elenco delimitato da spazi di tutti i file che voglio contrassegnare. Se copio e incollo l'output di quel comando sulla riga di comando, il git update-indexcomando funziona. Cosa non funziona con i tubi?

No, non mi basta aggiungere dira .gitignore. Ho bisogno che questi file siano nel repository, ma verranno apportate modifiche indesiderate localmente che devono essere ignorate in modo che gli utenti possano eseguire pull.

Risposte:


174

git update-index vuole i nomi dei file sulla sua riga di comando, non sul suo standard input.

Passo 1:

cd nella cartella che vuoi presumere sia invariata

Passo 2:

Puoi fare questo:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

o

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

Sebbene, in entrambi i casi, i nomi di file con spazi saranno problematici. Se li hai, puoi usare questo:

git ls-files -z | xargs -0 git update-index --assume-unchanged

Modifica: input incorporato da @MatthewScharley in merito git ls-files -z.

Comandi di Windows

Nota: se sei su Windows, usa Git Bash per eseguire questi comandi


2
Cordiali saluti, che `| tr '\ n' '' `bit non è necessario.
Václav Slavík

7
@twalberg: potresti semplicemente usaregit ls-files -z
Matthew Scharley,

2
@twalberg Come annullare questo comando "git ls-files -z | xargs -0 git update-index --assume-unchanged"
Mohamed Hussain

3
@ MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged, penserei ...
twalberg

1
git ls-files -z | git update-index -z --stdinè più pulito.
Jed

22

Il findcomando di GNU Findutils ha -execun'opzione che rimuove la maggior parte dei problemi di utilizzo xargs, sebbene la sua sintassi sia un po 'speciale. Tuttavia gestisce perfettamente i nomi di file con spazi.

Questo comando farà supporre a git che tutti i file nella e sotto la directory elencata siano invariati:

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Find prende tutti gli argomenti dopo -execfino a ;(che devi sfuggire per evitare che la tua shell lo mangi) e lo esegue una volta per ogni file trovato, sostituendo {}(di nuovo, virgolette singole in modo che la tua shell non lo mangi) con il nome del file trovato.

Usando findi criteri di corrispondenza di (massima profondità di ricorsione, se la corrispondenza è un file o una directory, se il nome del file corrisponde a un'espressione) e -execpuoi fare ogni sorta di cose potenti.

Non sono sicuro di altre implementazioni del findcomando. YMMV.


2
-execè un'opzione standard . È anche possibile -exec git update-index --assume-unchanged {} +(definito anche dallo standard) passare più nomi di file al comando contemporaneamente, riducendo il numero di volte in cui viene richiamato il comando git.
Tom Fenech

16

Aggiungi il nome della directory a .git/info/exclude. Funziona per i file non tracciati.


Questo funziona alla grande! Sapevi se funziona anche con i file?
betomoretti

Ma questo non spinge i file non tracciati github! c'è un modo possibile per ignorarli dai record ma mantenerli effettivamente nei repository !?
Mahmoud Zalt

2

Sì,

git update-index --assume-unchanged

funziona solo con i file, non con le directory. Penso, uno dei modi più veloci:

cd dir
ls | xargs -l git update-index --assume-unchanged

2
Invece di utilizzare cd, è possibile passare il dir come argomento finale: git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR.
kzh
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.