Domanda

Sto scrivendo uno script che apporta alcune modifiche banali e poi li impegna a git. Perché questi sono cambiamenti banali, voglio fare git commit --amend ogni volta che posso farla franca - in particolare, quando un modifica non "rovinare" la storia eventuali altri rami. Se un modificare vorrei rovinare un altro ramo, voglio fare un git commit standard invece.

Per esempio, se i miei rami sembravano questo (a la "visualizzare tutta la storia ramo" in Git GUI):

* [experimental branch] Added feature.
* [master branch] Trivial change from script
* ...

e sto correndo questo script sul ramo principale, quindi non voglio fare un modificare, perché sarei sostituzione di parte della storia del ramo sperimentale. Tecnicamente, questo non sarà effettivamente rompere nulla - l'originale commit sarà ancora parte della storia di sperimentale, e sarà ancora fa riferimento in modo da non ottenere garbage collection - ma avendo impegna quasi-ma-non-proprio-identici a due rami diversi rende la vita difficile quando poi voglio rebase o unione, quindi è una situazione che voglio evitare.

Come posso fare il mio script di rilevare automaticamente se un commit ha nulla ramificata da esso?

Se la semplificazione ipotesi di aiuto, ho sempre eseguito questo script sulla testa del padrone, e io uso solo git come un repository locale -. Io non spingere o tirare modifiche ovunque

Questo script è in Ruby, in modo da poter sia sborsare alla riga di comando git, o posso utilizzare attacchi di Ruby per git -. A seconda di quale renderebbe questo compito più facile

È stato utile?

Soluzione

Basta eseguire git branch --contains HEAD per ottenere un elenco di rami che "contengono" questo commesso. Se l'elenco è vuoto, che commettono dovrebbe essere sicuro per ammending. Si potrebbe anche voler includere la bandiera -a all'elenco locali e filiali remote.

In alternativa, si potrebbe confrontare l'output di git rev-parse HEAD con git merge-base HEAD other-branch. Se questi commettono ID sono identici, commettere la corrente è in un altro ramo del commettono storia.

Altri suggerimenti

Il commettere grafico è a senso unico: dato un commit, si sa tutto dei suoi antenati, ma non uno qualsiasi dei suoi figli. Dovrete iniziare alle estremità e backtrack fino ad arrivare al commit (s) che si desidera.

Usa git rev-list [some commit] --children (HEAD è l'impostazione predefinita):

$ git rev-list HEAD --children
6edbee61c87fb063700751815f0ad53907d0b7a4
aee452860ecd772b8bdcd27227e6a72e6f4435fd 6edbee61c87fb063700751815f0ad53907d0b7a4
ef8a1487b03256a489d135e76d1f0b01872f2349 aee452860ecd772b8bdcd27227e6a72e6f4435fd
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349
bbef0da56efe048f70293bd20bad0cb37b5e84f0 6910dc5833f6cd26133e32bef40ed54cf9337017
[...]

La colonna di sinistra è una lista di commettere SHA-1 in ordine cronologico inverso. Tutto ciò per che commettono di destra sono i bambini (--children) di che si impegnano. La parte superiore è impegnarsi HEAD e quindi ha figli.

Quindi, se grep per la vostra SHA-1 in questo elenco ed ha qualche cosa alla sua destra, ha almeno un figlio:

$ git rev-list --children | grep '^6910'
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349

Nel precedente esempio, impegnarsi 6910... ha un figlio, ef8a....

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top