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 默認情況下實際上不會更改作者的時間戳。

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'
- 3 回答
- 0 關注
- 2313 瀏覽
添加回答
舉報