2015-06-21 17 views
5

Tôi đang chuyển đổi một kho CVS cũ thành git, đã hoạt động rất tốt trừ tất cả các cam kết trong UTC thay cho múi giờ địa phương của mỗi tác giả.Thay đổi múi giờ cho tất cả các cam kết trong lịch sử git

Tôi muốn thay đổi múi giờ của các cam kết này trên cơ sở từng tác giả, ví dụ: tất cả các cam kết từ một tác giả thay đổi từ +0000 đến +1000, trong khi các cam kết từ các tác giả khác không đổi. (Vì vậy, tôi có thể thực hiện thủ tục này một lần cho mỗi tác giả.)

Thời điểm thực tế phải giữ nguyên, vì vậy cam kết hiện tại là 02:00:00 +0000 sẽ trở thành 12:00:00 +1000.

Điều này có thể xảy ra với một cái gì đó như git filter-branch không?

+1

Đừng quên rằng "Múi giờ! = Bù đắp" (xem [thẻ múi giờ wiki] (http://stackoverflow.com/tags/timezone/info)). Mức chênh lệch có thể thay đổi đối với một tác giả phụ thuộc vào DST. –

+0

Liên quan: http: // stackoverflow.com/a/23900181/634824 –

Trả lời

1

tôi đã đi lên với điều này, mà dường như làm các trick:

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' 

này thay đổi múi giờ cho tác giả [email protected]+0000-+1000. Nếu múi giờ đã là một cái gì đó khác trong một cam kết nhất định sau đó nó sẽ được giữ nguyên. Trong trường hợp người này là tác giả nhưng không phải là người ủy nhiệm (hoặc ngược lại), chỉ có ngày cho vai trò của họ sẽ được cập nhật.

Nó sẽ không xử lý thay đổi bù trừ UTC do DST như @MattJohnson đã chỉ ra, nhưng có lẽ bạn có thể thêm tiêu chí bổ sung cho điều đó nếu cần.

Điều này hoạt động bằng cách tận dụng định dạng ngày tháng nội bộ của git, luôn được đo bằng giây kể từ kỷ nguyên và trông giống như @12345 +0000. Múi giờ ở đây không được sử dụng (số giây luôn bằng UTC) cho phép bạn thay đổi múi giờ mà không thay đổi thời điểm hiệu quả trong thời gian được tham chiếu. Thay đổi độ lệch UTC ở đây chỉ ảnh hưởng đến định dạng mặc định của ngày.

2

Ngoài @Malvineous' câu trả lời:

Nếu đó là okay để sử dụng múi giờ của người dùng hiện như một tài liệu tham khảo, bạn có thể sử dụng Git để làm việc chuyển đổi DST. Điều này đã làm cho các trick cho tôi, sửa chữa tất cả các múi giờ cam kết với múi giờ hiện tại, bao gồm cả DST thay đổi.

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 
' 

Dải dòng sed khỏi múi giờ. GIt chăm sóc phần còn lại.

Xin lưu ý rằng điều này không hỗ trợ múi giờ rõ ràng như được yêu cầu ban đầu, nhưng phải đảm bảo DST.

LƯU Ý: Câu trả lời ban đầu có thêm một dây chuyền sử dụng date, ví dụ,

GIT_AUTHOR_DATE=`date --date=$GIT_AUTHOR_DATE` 

Tuy nhiên, điều này là không cần thiết bởi vì xử lý sử dụng múi giờ hiện tại (bao gồm DST) khi không được chỉ định. Do đó, cắt múi giờ là đủ.

+0

Không chắc chắn ý nghĩa của "chuyển đổi DST" ở đây, nhưng khi tôi chạy nó vào mùa đông với TZ = Europe/London nó chuyển đổi tất cả các lần thành UTC (+0000) và không xử lý thực tế rằng một số cam kết đã là mùa hè năm ngoái khi London đang sử dụng Giờ mùa hè của Anh. (Tôi đã cố gắng sắp xếp một kho lưu trữ mà tôi đã cam kết từ một máy chủ ở Hoa Kỳ đã được đặt thành múi giờ của Hoa Kỳ và tôi muốn có thời gian tại địa phương của Anh được ghi lại trên cam kết.) –

Các vấn đề liên quan