簡體   English   中英

更改git歷史記錄中所有提交的時區

[英]Change timezone for all commits in git history

我正在將舊的CVS存儲庫轉換為git,除了所有提交都是UTC而不是每個作者的本地時區之外,它已經很好地工作了。

我想基於每個作者更改這些提交的時區,因此例如來自一個作者的所有提交從+0000變為+1000,而來自其他作者的提交不變。 (所以我可以為每位作者執行一次此程序。)

實際時刻應該保持不變,因此當前02:00:00 +0000的提交應該變為12:00:00 +1000

這可能與git filter-branch嗎?

除了@Malvineous'回答:

如果可以使用當前用戶的時區作為參考,則可以使用Git進行DST轉換。 這對我來說很有把握,將所有提交的時區修復到當前時區,包括DST更改。

git filter-branch --env-filter '
  if [ "$GIT_AUTHOR_EMAIL" == "email@example.com" ]; then
    GIT_AUTHOR_DATE=`echo $GIT_AUTHOR_DATE|sed -e "s/[+-][0-9]\{4\}//g"`
  fi
  if [ "$GIT_COMMITTER_EMAIL" == "email@example.com" ]; 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)。 因此,切割時區就足夠了。

我想出了這個,似乎可以解決這個問題:

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

這會將作者email@example.com的時區從+0000更改為+1000 如果時區已經是給定提交中的其他內容,那么它將保持不變。 如果此人是作者而不是提交者(反之亦然),則只更新其角色的日期。

正如@MattJohnson指出的那樣,它不會處理因DST而導致的UTC偏移變化,但是如果需要,也許你可以為此添加額外的標准。

這可以通過利用git的內部日期格式來實現,該格式始終以自紀元以​​來的秒數開始測量,看起來像@12345 +0000 此處的時區未使用(秒數始終為UTC),允許您在不更改引用的有效時刻的情況下更改時區。 此處更改UTC偏移僅影響日期的默認格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM