2011-08-29 26 views
15

Non penso sia possibile, ma ho pensato che qualcuno potrebbe avere un'idea elegante di come ottenere ciò:Ottenere git per non spingere mai un singolo commit?

Ho un progetto che ho verificato che esisteva da molto prima che lo prendessi. Ho circa una dozzina di modifiche in vari file che non voglio mai archiviare (sono tutte modifiche di configurazione).

C'è un modo per commettere questo insieme di modifiche e quindi non spingere mai effettivamente quel commit? So che suona strano :)

precisazione:

Voglio che questi cambiamenti di rimanere nella mia directory di lavoro, ho bisogno di loro per l'applicazione di funzionare a livello locale. Voglio essere in grado di mantenere commettere altri cambiamenti intorno a loro, anche i cambiamenti nello stesso file, ma mai spingere i cambiamenti di configurazione a qualsiasi altro luogo ...

E 'un po' come prima di ogni spingere vorrei:

  • ciliegia pick and riporre questo commettere
  • rebase quello commettere fuori
  • spinta
  • riapplicare questa scorta alla mia base di codice

risposta

18

Questo è un modello simile per mantenere una patch locale impostata su un progetto upstream che non si controlla. Il modo più semplice per gestire questo è di avere un ramo intermedio che tutte le modifiche vengono unite attraverso, in questo modo:

___________________________ master 
\__________________________ config-changes 
    \_____________________ daily-work 

master contiene tutto ciò che è da condividere. Le uniche cose commesse in config-changes sono le modifiche che si desidera poter ripristinare facilmente quando sono condivise. daily-work è il ramo si fa tutto il lavoro in Per configurarlo, fare:.

# (no local config changes should be in master at this point) 
git checkout -b config-changes master 
# Make your config-related changes that you don't want to share 
git commit -am "Made local config changes" 
git checkout -b daily-work 
# Work and commit like normal 

Quando sei pronto a condividere le modifiche, fare:

git rebase --onto master config-changes daily-work 
git checkout master 
git merge daily-work 

che tornerà tutte le modifiche fatto in config-changes, ma in caso contrario assomiglia a quello derivato direttamente da master. Tieni presente che dopo aver eseguito questa correzione, se vuoi continuare a lavorare in daily-work, devi rebase nuovamente su config-changes, ma è molto meglio creare un nuovo ramo per ogni modifica.

Quando è necessario tirare giù le modifiche apportate dal master, do:

git checkout master 
git pull 
git checkout config-changes 
git merge master 

La fusione riapplica le modifiche di configurazione locale collegati l'ultimo maestro. Sei quindi libero di creare un nuovo ramo daily-work o unire config-changes in quello vecchio, a seconda dei casi. Fondamentalmente, non ti unisci direttamente da master a daily-work. Per prima cosa passa sempre attraverso config-changes.

All'inizio sembra un sacco di lavoro, ma una volta che lo fai una o due volte vedrai che è molto più semplice che mantenere le modifiche manualmente.

+0

Fantastico, questo è esattamente quello che stavo cercando/sperando. Grazie! –

+0

Questo è stato molto utile. Grazie! – Pat

+0

SmartGit dispone di una funzione denominata "Interactive Rebase" che consente di spostare facilmente i commit su e giù. In questo caso, spostando il commit "config-changes" in alto è più semplice nella finestra di dialogo. Quindi, basta premere il commit appena prima di "config-changes". Come misura preventiva per evitare di spingere accidentalmente le mie temp commits, aggiungo un prefisso "TMP:" nel messaggio di commit, e poi ho aggiunto un push hook locale per avvertirmi quando ho premuto accidentalmente il mio temp commit. – Ryuu

0

Sì, basta creare un ramo separato e memorizzare questi cambiamenti c'è:

git checkout -b your-new-branch 
git commit -a 

Dopo aver finito di commettere, basta tornare al ramo originale e dimenticare questi cambiamenti.

+0

Penso che voglia i cambiamenti nel ramo su cui sta lavorando ora. Tornando rimuoverei le modifiche. – manojlds

+0

Desidero le modifiche nella mia base di codice locale. io li voglio tutti nella mia directory di lavoro, semplicemente non li voglio mai spingere da nessuna parte. Se faccio questo in un ramo, non vedo come potrei mai avere accesso a entrambi questi cambiamenti e quelli che voglio spingere. –

+0

Forse è così. Aspetterò che i lupi facciano chiarezza. –

3

Utilizzare git update-index --assume-unchanged su questi file per fare in modo che git pensi che i file non vengano modificati.

Dopo i commenti, un'alternativa consiste nell'avere un ramo separato da cui si esegue il push. I commit in questo ramo sono raccolti in ciliegio ecc. Dal ramo di lavoro. Quindi, quando vuoi spingere, passa al ramo "push", cherry-pick commits da "work" e push.

+0

Se sto leggendo i documenti correttamente, questo è simile a un 'git ignore'? –

+0

@cwolves - Questo è per "ignorare" le modifiche ai file già tracciati. 'git ignore' serve per ignorare i file dal repository. – manojlds

+0

ahh, gotcha. Grazie, ma non proprio quello di cui ho bisogno - Devo essere in grado di impegnarmi in un secondo momento su quel file, ma non sulle modifiche apportate in precedenza ... Sto lavorando a un progetto in cui la "config" è sparpagliata tra una dozzina di file che ho anche bisogno di modificare in seguito. Idealmente mi piacerebbe consolidare tutto questo in uno/un paio di file di configurazione, ma è così legato a tutto ciò che ci vorrebbe una mezza giornata da fare ... –

Problemi correlati