git rebase sans changer de commettre des horodateurs
Serait-il judicieux d'effectuer git rebase
tout en préservant la validation des timestamps?
Je crois conséquence serait que la nouvelle direction n'auront pas nécessairement commettre les dates dans l'ordre chronologique. C'est que théoriquement possible? (par exemple, à l'aide de la plomberie des commandes; il suffit de curieux, c'est ici)
Si elle est théoriquement possible, est-il possible, dans la pratique, avec cela, de ne pas modifier le timestamp?
Par exemple, supposons que j'ai l'arbre suivant:
master <jun 2010>
|
:
:
: oldbranch <feb 1984>
: /
oldcommit <jan 1984>
Maintenant, si je rebase oldbranch
sur master
, la date de la validation des modifications à partir de février 1984 à juin 2010. Est-il possible de changer ce comportement, de sorte que la validation d'horodatage n'est pas modifié? En fin de compte je voudrais donc obtenir:
oldbranch <feb 1984>
/
master <jun 2010>
|
:
Que cela ferait beaucoup de sens? Est-il même permis à git d'avoir une histoire où un ancien commit a une plus récente, s'engager en tant que parent?
- C'est funky que la réponse à la question est en effet de "vous n'avez pas besoin de faire quoi que ce soit - c'est la façon dont il fonctionne par défaut". Mais maintenant, supposons que vous souhaitez engager à être triés dans le bon ordre de date, tout en faisant des rebase (ce qui est assez naturel scénario si vous pensez à ce sujet). Maintenant, je n'ai pas pu trouver comment l'atteindre, ainsi que posté mon q comme stackoverflow.com/questions/12270357/really-flatten-a-git-merge
- David mentionne une autre option pour réinitialiser committer date:
git rebase --committer-date-is-author-date SHA
. Voir mon édité réponse ci-dessous - Je viens d'écrire un une vaste réponse sur question similaire dont l'auteur a essayé les réponses expliqué ici et je ne pouvais pas les appliquer de manière satisfaisante.
Vous devez vous connecter pour publier un commentaire.
Mise à jour juin 2014: David Fraser mentionne dans les commentaires une solution aussi détaillée dans "Changement des horodateurs, tandis que le rebasage git branch", à l'aide de l'option
--committer-date-is-author-date
(introduit initialement dans Janv. 2009 dans s'engager 3f01ad6Voir
git am
:(Réponse originale à cette question, juin 2012)
Vous pourriez essayer, pour une non-interactive rebase
(à partir de ce DONC réponse)
C'est passé à
git am
, qui mentionne:Pour
git rebase
, cette option est "Incompatible avec l' --interactive option."Depuis vous pouvez modifier à volonté le timestamp de l'ancien commit date (avec
git filter-branch
), je suppose que vous pouvez organiser votre historique de Git avec tout ce que commettre date ordre que vous souhaitez/besoin, même ensemble pour l'avenir!.Comme Olivier mentionne dans sa question, le auteur date n'est jamais modifié par un rebase;
À partir de la Pro Git Livre:
Pour être plus clair, dans ce cas, comme Olivier commentaires:
git rebase --ignore-date
ne fonctionne pas. Il change les dates de la relocalisée s'engage.--ignore-date
ne le face de ce que je cherchais! À savoir, il efface l'auteur de l'horodatage et de les remplacer par les commits horodateurs! Donc la bonne réponse à ma question est: ne faites rien, depuisgit rebase
ne fait pas changer d'auteurs horodateurs par défaut.--committer-date-is-author-date
option semble laisser à l'auteur d'horodatage, et de définir le livreur timestamp être le même que l'auteur original timestamp, qui est ce qu'Olivier a voulu...git rebase --committer-date-is-author-date SHA_of_root_commit
sur l'ensemble de mes branches zippée à tous de retour de nouveau ensemble! Yay!!!git log --pretty=fuller | egrep '^commit|Date'
Si vous avez déjà bousillé la validation des dates (peut-être avec un rebase) et de les remettre à leur auteur correspondant dates, vous pouvez exécuter:
git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'
WARNING: Ref 'refs/heads/master' is unchanged
. Je suis à l'aide de git version 1.7.9.5 sur Linux (64 bits)git rebase --committer-date-is-author-date <base_branch>
de Cette façon, git va réinitialiser la validation de la date uniquement pour les commits appliqué sur <base_branch> (qui est probablement le même nom de la branche que vous avez utilisé lorsque vous foiré).Une question cruciale de Von C m'a aidé à comprendre ce qui se passe: lorsque votre rebase, le committer de timestamp change, mais pas le de l'auteur timestamp, qui soudain prend tout son sens. Donc ma question était en fait pas assez précise.
La réponse est que cela ne fait pas changer l'auteur du horodateurs (vous n'avez pas besoin de faire quoi que ce soit), ce qui me convient parfaitement.
Par défaut, git rebase va définir le livreur du timestamp au moment où l'
nouveau commit est créé, mais gardez à l'auteur de l'horodatage intacte. La plupart du temps,
c'est le comportement souhaité, mais à certains scénarios, nous dot souhaitez pas en changer
le commiter horodatage de l'un ou l'autre. Comment pouvons-nous réaliser? Eh bien, voici la
truc j'ai l'habitude de faire.
Tout d'abord, assurez-vous que chacun des commits que vous êtes sur le point de rebase est unique
message de commit et auteur d'horodatage (C'est là où est l'astuce besoins des améliorations, actuellement, il est adapté à mes besoins si).
Avant le rebase, enregistrer le livreur de l'horodatage, l'auteur de l'horodatage et le message de validation de tous les commits qui sera relocalisée dans un fichier.
Ensuite, laissez le réel rebase lieu.
Enfin, nous avons remplacer l'actuel valider l'horodatage avec celui enregistré dans le fichier si le message de commit est la même en utilisant
git filter-branch
.Si quelque chose va mal, il suffit de la caisse
git reflog
ou tous lesrefs/original/
réf.Furthormore, vous pouvez faire la même chose à l'auteur de l'horodatage.
Par exemple, si l'auteur de l'horodatage de certains commits sont hors de l'ordre, et
sans réorganiser ces s'engage, nous voulons juste que l'auteur de l'horodatage de montrer dans
l'ordre, alors les commandes suivantes vont vous aider.