2015-06-21 185 views
5

我正在將舊的CVS存儲庫轉換爲git,除非所有提交都是UTC,而不是每個作者的本地時區,否則它工作得很好。更改git歷史記錄中所有提交的時區

我想在每個作者的基礎上更改這些提交的時區,例如,來自一位作者的所有提交從+0000改爲+1000,而來自其他作者的提交保持不變。 (所以我可以爲每個作者執行一次這個過程。)

實際時間應該保持不變,所以當前02:00:00 +0000的提交應該變爲12:00:00 +1000

這是可能的東西像git filter-branch

+1

不要忘記「時區!=偏移」(請參閱​​[時區標記wiki](http://stackoverflow.com/tags/timezone/info))。取決於DST,單個作者的偏移量可能會有所不同。 –

+0

相關:http:// stackoverflow。com/a/23900181/634824 –

回答

1

我來到了這一點,這似乎這樣的伎倆:

git filter-branch --env-filter ' 
    if [ "$GIT_AUTHOR_EMAIL" == "[email protected]" ]; then 
     export GIT_AUTHOR_DATE=`echo $GIT_AUTHOR_DATE | sed s/+0000/+1000/` 
    fi 
    if [ "$GIT_COMMITTER_EMAIL" == "[email protected]" ]; then 
     export GIT_COMMITTER_DATE=`echo $GIT_COMMITTER_DATE | sed s/+0000/+1000/` 
    fi' 

這將改變從+0000+1000時區作者[email protected]。如果時區在給定提交中已經是別的東西,那麼它將保持不變。如果此人是作者而不是提交者(反之亦然),則只更新其角色的日期。

它不會像@MattJohnson指出的那樣處理由DST引起的UTC偏移量的變化,但是如果需要的話,您可以添加其他標準。

這是通過利用git的內部日期格式,它始終以秒爲單位測量,並且看起來像@12345 +0000。此處的時區未使用(秒數總是以UTC表示),它允許您更改時區而不更改正在引用的有效時刻。在這裏更改UTC偏移僅影響日期的默認格式。

2

除了@Malvineous'回答:

如果它的好使用當前用戶的時區作爲參考,還可以使用Git做DST轉換。這對我來說是個訣竅,將所有提交的時區固定到當前時區,包括DST更改。

git filter-branch --env-filter ' 
    if [ "$GIT_AUTHOR_EMAIL" == "[email protected]" ]; then 
    GIT_AUTHOR_DATE=`echo $GIT_AUTHOR_DATE|sed -e "s/[+-][0-9]\{4\}//g"` 
    fi 
    if [ "$GIT_COMMITTER_EMAIL" == "[email protected]" ]; then 
    GIT_COMMITTER_DATE=`echo $GIT_COMMITTER_DATE|sed -e "s/[+-][0-9]\{4\}//g"` 
    fi 
' 

sed線剝離時區。 GIt負責其餘部分。

請注意,這不支持最初請求的顯式時區,但會照顧DST。

注: 原答案使用date,例如,

GIT_AUTHOR_DATE=`date --date=$GIT_AUTHOR_DATE` 

然而,由於手柄使用當前時區(包括DST)沒有指定時,這是沒有必要有一個附加的線。因此,切斷時區就足夠了。

+0

不知道這裏的「DST轉換」是什麼意思,但是當我在TZ = Europe/London的冬天跑它時,它將所有時間都轉換爲UTC(+0000),並沒有處理這個事實去年夏天倫敦正在使用英國夏令時的一些承諾。 (我一直在嘗試整理一個我從美國服務器上提交的存儲庫,該服務器設置爲美國時區,我寧願將我在本地的英國時間記錄在提交上。) –

相關問題