亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

git rebase而不更改提交時間戳

git rebase而不更改提交時間戳

Git
慕的地8271018 2019-10-15 09:54:53
git rebase在保留提交時間戳的同時執行是否有意義?我認為后果是新分支不一定按時間順序排列提交日期。從理論上講這完全可能嗎?(例如,使用管道命令;只是在這里感到好奇)如果理論上可行,那么實踐中是否有可能重新設置基準而不更改時間戳?例如,假設我有以下樹:master <jun 2010>  |  :  :  :     oldbranch <feb 1984>  :     /oldcommit <jan 1984>現在,如果我oldbranch依據的話master,提交的日期將從1984年2月更改為2010年6月。是否可以更改該行為,以便不更改提交時間戳記?最后,我將獲得:      oldbranch <feb 1984>      / master <jun 2010>    |    :那完全有意義嗎?甚至在git中允許有一個歷史記錄,其中舊提交作為父提交具有較新的提交?
查看完整描述

3 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

David Fraser 在評論中提到了一種解決方案,該解決方案在“ 使用git分支更改基礎時更改時間戳 ”中也有詳細--committer-date-is-author-date介紹,使用了該選項(最初于2009年1月在commit 3f01ad6中引入


請注意,該--committer-date-is-author-date選項似乎保留了作者時間戳,并將提交者時間戳設置為與原始作者時間戳相同,這是OP Olivier Verdier想要的。


我找到了正確日期的最后一次提交,并做到了:


git rebase --committer-date-is-author-date SHA

見git am:


--committer-date-is-author-date

默認情況下,該命令將電子郵件中的日期記錄為提交作者日期,并將提交創建的時間用作提交者日期。

這允許用戶使用與作者日期相同的值來確定提交者日期。


(原始答案,2012年6月)


你可以嘗試,對于非交互式的rebase


git rebase --ignore-date

(從這個SO答案)


這傳遞給git am,其中提到:


 --ignore-date

默認情況下,該命令將電子郵件中的日期記錄為提交作者日期,并將提交創建的時間用作提交者日期。

這允許用戶通過使用與提交者日期相同的值來說謊關于作者日期。


對于git rebase,此選項為“與--interactive選項不兼容”。


由于您可以隨意更改舊提交日期的時間戳記(帶有git filter-branch),因此我想您可以按照想要/需要的任何提交日期順序來組織您的Git歷史記錄,甚至可以將其設置為將來!。


正如奧利維爾(Olivier)在他的問題中提到的那樣,作者的日期永遠不會因更改基準而改變。

從Pro Git書中:


作者是最初撰寫作品的人,

而提交者是最后應用該作品的人。

因此,如果您向項目發送補丁程序,并且其中一個核心成員應用了補丁程序,那么你們兩個都將獲得榮譽。


在這種情況下,要更加清楚,正如奧利維爾(Olivier)所說:


這--ignore-date與我要實現的目標相反!

即,它將刪除作者的時間戳,并用提交時間戳替換它們!

因此,對我的問題的正確答案是:

不要執行任何操作,因為git rebase 默認情況下實際上不會更改作者的時間戳。


查看完整回答
反對 回復 2019-10-15
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

默認情況下,git rebase會將提交者的時間戳設置為創建新提交時的時間,但保持作者的時間戳不變。大多數時候,這是期望的行為,但是在某些情況下,我們也不想更改提交者的時間戳。我們怎樣才能做到這一點?好吧,這是我通常做的把戲。


首先,確保您將要重新建立基礎的每個提交都具有唯一的提交消息和作者時間戳(這是技巧需要改進的地方,盡管目前可以滿足我的需要)。


在重新設置基準之前,請記錄提交者的時間戳,作者的時間戳以及所有將基于文件的提交的提交消息。


#NOTE: BASE is the commit where your rebase begins

git log --pretty='%ct %at %s' BASE..HEAD > hashlog

然后,進行實際的變基。


最后,如果使用提交消息相同,則用文件中記錄的時間戳替換當前提交者的時間戳git filter-branch。


 git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%at %s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_COMMITTER_DATE=$__date || cat'

如果出了什么問題,只需結帳git reflog或所有refs/original/參考。


此外,您可以執行與作者的時間戳類似的操作。


例如,如果作者的某些提交時間戳不正確,并且沒有重新排列這些提交,我們只希望作者的時間戳按順序顯示,那么以下命令將有所幫助。


git log --pretty='%at %s' COMMIT1..COMMIT2 > hashlog

join -1 1 -2 1 <(cat hashlog | cut -f 1 | sort -nr | awk '{ print NR" "$1 }') <(cat hashlog | awk '{ print NR" "$0 }') | cut -d" " -f2,4- > hashlog_

mv hashlog_ hashlog

git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_AUTHOR_DATE=$__date || cat'


查看完整回答
反對 回復 2019-10-15
  • 3 回答
  • 0 關注
  • 2313 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號