3 回答

TA貢獻(xiàn)1802條經(jīng)驗 獲得超10個贊
David Fraser 在評論中提到了一種解決方案,該解決方案在“ 使用git分支更改基礎(chǔ)時更改時間戳 ”中也有詳細(xì)--committer-date-is-author-date介紹,使用了該選項(最初于2009年1月在commit 3f01ad6中引入
請注意,該--committer-date-is-author-date選項似乎保留了作者時間戳,并將提交者時間戳設(shè)置為與原始作者時間戳相同,這是OP Olivier Verdier想要的。
我找到了正確日期的最后一次提交,并做到了:
git rebase --committer-date-is-author-date SHA
見git am:
--committer-date-is-author-date
默認(rèn)情況下,該命令將電子郵件中的日期記錄為提交作者日期,并將提交創(chuàng)建的時間用作提交者日期。
這允許用戶使用與作者日期相同的值來確定提交者日期。
(原始答案,2012年6月)
你可以嘗試,對于非交互式的rebase
git rebase --ignore-date
(從這個SO答案)
這傳遞給git am,其中提到:
--ignore-date
默認(rèn)情況下,該命令將電子郵件中的日期記錄為提交作者日期,并將提交創(chuàng)建的時間用作提交者日期。
這允許用戶通過使用與提交者日期相同的值來說謊關(guān)于作者日期。
對于git rebase,此選項為“與--interactive選項不兼容”。
由于您可以隨意更改舊提交日期的時間戳記(帶有g(shù)it filter-branch),因此我想您可以按照想要/需要的任何提交日期順序來組織您的Git歷史記錄,甚至可以將其設(shè)置為將來!。
正如奧利維爾(Olivier)在他的問題中提到的那樣,作者的日期永遠(yuǎn)不會因更改基準(zhǔn)而改變。
從Pro Git書中:
作者是最初撰寫作品的人,
而提交者是最后應(yīng)用該作品的人。
因此,如果您向項目發(fā)送補(bǔ)丁程序,并且其中一個核心成員應(yīng)用了補(bǔ)丁程序,那么你們兩個都將獲得榮譽(yù)。
在這種情況下,要更加清楚,正如奧利維爾(Olivier)所說:
這--ignore-date與我要實現(xiàn)的目標(biāo)相反!
即,它將刪除作者的時間戳,并用提交時間戳替換它們!
因此,對我的問題的正確答案是:
不要執(zhí)行任何操作,因為git rebase 默認(rèn)情況下實際上不會更改作者的時間戳。

TA貢獻(xiàn)1801條經(jīng)驗 獲得超16個贊
默認(rèn)情況下,git rebase會將提交者的時間戳設(shè)置為創(chuàng)建新提交時的時間,但保持作者的時間戳不變。大多數(shù)時候,這是期望的行為,但是在某些情況下,我們也不想更改提交者的時間戳。我們怎樣才能做到這一點(diǎn)?好吧,這是我通常做的把戲。
首先,確保您將要重新建立基礎(chǔ)的每個提交都具有唯一的提交消息和作者時間戳(這是技巧需要改進(jìn)的地方,盡管目前可以滿足我的需要)。
在重新設(shè)置基準(zhǔn)之前,請記錄提交者的時間戳,作者的時間戳以及所有將基于文件的提交的提交消息。
#NOTE: BASE is the commit where your rebase begins
git log --pretty='%ct %at %s' BASE..HEAD > hashlog
然后,進(jìn)行實際的變基。
最后,如果使用提交消息相同,則用文件中記錄的時間戳替換當(dāng)前提交者的時間戳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'
如果出了什么問題,只需結(jié)帳git reflog或所有refs/original/參考。
此外,您可以執(zhí)行與作者的時間戳類似的操作。
例如,如果作者的某些提交時間戳不正確,并且沒有重新排列這些提交,我們只希望作者的時間戳按順序顯示,那么以下命令將有所幫助。
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 關(guān)注
- 2350 瀏覽
添加回答
舉報