Conserva il file in un repository Git, ma non tenere traccia delle modifiche


305

Ho diversi file in un sito CodeIgniter che vorrò avere nel repository ma senza tenere traccia delle modifiche.

Ad esempio, distribuisco una nuova installazione di questo framework su un nuovo client, desidero scaricare i seguenti file (hanno i valori predefiniti CHANGEME) e devo solo apportare modifiche specifiche a questo client (credenziali del database, informazioni sull'indirizzo email, CSS personalizzato).

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css

Attualmente se corro

git clone git@github.com:user123/myRepo.git httpdocs

e quindi modificare i file sopra, tutto è fantastico. Fino a quando rilascerò un aggiornamento rapido o una patch ed eseguirò git pull. Tutte le mie modifiche vengono quindi sovrascritte.





Potresti semplicemente ignorare i file delle credenziali / di configurazione del client e fare in modo che il programma crei file predefiniti se mancano quando è installato il repository?
MatthewG

Risposte:


618

git ha una soluzione diversa per farlo. Innanzitutto modifica il file che non desideri monitorare e utilizza il seguente comando:

git update-index --assume-unchanged FILE_NAME

e se vuoi rintracciare di nuovo le modifiche usa questo comando:

git update-index --no-assume-unchanged FILE_NAME

documentazione git-update-index


Ho fatto quello che dici ma lo stato di git continua a dire che il file è stato modificato
rraallvv

7
Sì, questa dovrebbe essere la "Risposta accettata". Ha funzionato per me.
joshmcode

34
Secondo Junio ​​Hamano (il manutentore di Git): "Assumere invariato non dovrebbe essere abusato di un meccanismo ignorato. [...] non è una promessa di Git che Git considererà sempre questi percorsi non modificati --- se Git può determinare un percorso contrassegnato come assunto invariato è cambiato senza incorrere in costi extra di lstat (2), si riserva il diritto di segnalare che il percorso è stato modificato (di conseguenza, "git commit -a" è libero di impegnarlo modificare)." In altre parole, supporre invariato è solo per problemi di prestazioni locali. Se Git è in grado di determinare che quei file sono cambiati in modo più leggero, lo farà.
Alejandro García Iglesias,

41
Leggendo le informazioni per questo, penso che l' --skip-worktreeopzione sia più adatta a questo lavoro che a --assume-unchanged.
PJSCopeland

26
--skip-worktree è davvero l'opzione migliore. Ulteriori informazioni: stackoverflow.com/questions/13630849/…
Customizer,

80

Per estrarre una risposta dai commenti di un'altra risposta:

$ git update-index --skip-worktree FILENAME

Sembra essere un'opzione migliore di --assume-unchanged

Altro può essere letto qui: Git - Differenza tra 'assume-invariato' e 'skip-worktree'



Quando lo faccio e poi provo a cambiare i rami, ottengo "I seguenti file dell'albero di lavoro non tracciati verrebbero sovrascritti dal checkout ... Sposta o rimuovili prima di cambiare ramo". Qualche idea su come evitare?
Patrick Szalapski il

L'articolo a cui fa riferimento @aexl è stato spostato su compiledsuccessfully.dev/git-skip-worktree
Andrew Keeton il

1
I dottori dicono che questa è una cattiva idea. "Gli utenti spesso provano a usare i bit di sostituzione invariata e skip-worktree per dire a Git di ignorare le modifiche ai file che vengono tracciati. Questo non funziona come previsto, poiché Git può ancora verificare i file dell'albero di lavoro rispetto all'indice durante l'esecuzione di determinate operazioni. In generale, Git non fornisce un modo per ignorare le modifiche ai file tracciati, quindi sono consigliate soluzioni alternative. "
Curtis Blackwell,

58

Per i miei progetti Code Igniter, tengo database.php.example e config.php.example nel repository.

Quindi aggiungo config.php e applicazioni / config / database.php al file .gitignore .

Quindi, finalmente, quando eseguo la distribuzione, posso copiare i file .example (in config.php e database.php), personalizzarli e non verranno tracciati da GIT.


12
Bella soluzione, ma penso che la risposta di nasirkhan sia la migliore.
parole per il

Questa non è una buona soluzione. Se scarichi il tuo indice git, inizierai a tracciare le modifiche quando non intendi farlo. Vedi la risposta di @nasirkhans per il modo corretto di farlo.
Brian Melton-Grace - MSFT,

3
Non sono d'accordo con entrambi i commenti precedenti. In questo modo è molto più semplice aggiornare i valori "predefiniti" senza doverli estrarre e copiare la configurazione locale altrove solo per rimetterli dopo. Inoltre, si applica a tutti i repository, quindi non è necessario effettuare ripetute modifiche ai repository.
OskarD90,

1
se è in gitignore perché dovrebbe ricominciare a tracciare le modifiche
Shapeshifter il

Risolve il problema del PO ma non risponde realmente alla domanda.
Travis Wilson,

1

Vorrei metterli nel tuo .gitignorefile e copiarli manualmente se necessario.

Quindi il nome del file scheletro sarebbe in git, i nomi dei file ignorati non sarebbero in git (ma sarebbero in .gitignore). In questo modo, quando viene eseguito il passaggio manuale per copiarli in "effettivo" da "modello" (forse un nome migliore di scheletro), vengono immediatamente ignorati.


1
non c'è modo di aggiungerli prima nel repository, quindi aggiungerli a .gitignore? Sarebbe bello se ci fosse una soluzione per includere i file ma non le modifiche dopo un certo commit o qualcosa del genere.
Gorelative il

1
@mklauber Voglio mantenerli indefinitamente fino a quando corro git rm <file>. Lo scopo è IE: un file config.php. Voglio mantenere il file di configurazione ma ovviamente non voglio tenere traccia delle credenziali del database da un client all'altro poiché sono diverse.
Gorelative il

1
Sì, ho il problema con il nostro file rails database.yml. Manteniamo uno scheletro e poi lo copiamo e lo cambiamo.
Michael Durrant,

se creo questi file di configurazione "Skeleton", li aggiungeresti a un commit iniziale. e quindi modificando .gitignore per ignorare il file? In effetti mantenendo il file nel repository ma come scheletro?
gorelativo

10
Sono disponibili queste due opzioni: Aggiungi il file git add file1e quindi modifica il .gitignorefile. Il file memorizzato rimarrà lì e non verrà aggiornato. Oppure: è possibile aggiungere il file .gitignoree quindi aggiungerlo git add --force file1per forzare il file. È possibile utilizzare la seconda opzione ogni volta che è necessario sovrascrivere il file
klaustopher

1

Le risposte fornite stanno risolvendo il problema solo parzialmente, ma introducendo ancora più problemi.

Avevo bisogno di preservare il file "Web.Local.config". L'unica soluzione che ha funzionato per me è stata:

1. Escludere il file dal progetto

2. Creare una copia separata del file come Web.LocalTemplate.config

Ora che "Web.LocalTemplate.config" è tracciato da Git, tutti gli sviluppatori possono usarlo come punto di partenza. Tuttavia, il "Web.Local.config", non facente parte del progetto, verrà automaticamente ignorato.


In che modo git update-index --skip-worktree FILENAMErisolve solo parzialmente il tuo problema o addirittura aggiungi altri problemi ?? Risolve esattamente quello che stai cercando di fare. Hai provato?
Amir Asyraf,
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.