2015-06-21 17 views
5

Konwertuję stare repozytorium CVS na git, które działa bardzo dobrze, z tym wyjątkiem, że wszystkie zatwierdzenia są w UTC zamiast lokalnej strefy czasowej każdego autora.Zmień strefę czasową dla wszystkich zatwierdzeń w historii git

Chciałbym zmienić strefę czasową tych zatwierdzeń dla poszczególnych autorów, więc na przykład wszystkie zmiany od jednego autora zmieniają się z +0000 na +1000, podczas gdy zatwierdzenia od innych autorów pozostają niezmienione. (Tak więc mogę wykonać tę procedurę raz dla każdego autora.)

Rzeczywisty moment powinien pozostać bez zmian, więc zatwierdzenie, które jest obecnie 02:00:00 +0000, powinno stać się 12:00:00 +1000.

Czy jest to możliwe z czymś takim jak git filter-branch?

+1

Nie zapomnij, że "Strefa czasowa! = Przesunięcie" (patrz [wiki tagu strefy czasowej] (http://stackoverflow.com/tags/timezone/info)). Przesunięcie może być różne dla pojedynczego autora w zależności od czasu letniego. –

+0

Powiązane: http: // stackoverflow.com/a/23900181/634824 –

Odpowiedz

1

mam wymyślić to, co wydaje się rade:

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' 

To zmienia strefę czasową dla autora [email protected] z +0000 do +1000. Jeśli strefa czasowa jest już czymś innym w danym zatwierdzeniu, pozostanie niezmieniona. W przypadku, gdy ta osoba była autorką, ale nie komisarzem (lub odwrotnie), zaktualizowana zostanie tylko data ich roli.

Nie będzie obsługiwać zmiany przesunięć UTC z powodu DST, jak wskazano @MattJohnson, ale może w razie potrzeby można dodać dodatkowe kryteria.

To działa, wykorzystując wewnętrzny format daty git, który jest zawsze mierzony w sekundach od epoki i wygląda jak @12345 +0000. Strefa czasowa tutaj nie jest używana (liczba sekund jest zawsze w UTC), która pozwala zmienić strefę czasową bez zmiany faktycznego momentu w czasie, do którego się odwołuje. Zmiana tu offsetu UTC wpływa tylko na domyślne formatowanie daty.

2

Oprócz @Malvineous' odpowiedź:

Jeśli jest w porządku, aby korzystać czasową bieżącego użytkownika jako punkt odniesienia, można użyć Git zrobić konwersję DST. Zrobiłem to dla mnie, ustawiając strefy czasowe wszystkich zatwierdzeń na bieżącą strefę czasową, w tym zmianę czasu letniego.

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 
' 

Linia sed odcina strefę czasową. GIT zajmuje się resztą.

Należy pamiętać, że nie obsługuje to konkretnej strefy czasowej zgodnie z pierwotnymi żądaniami, ale zajmuje się DST.

UWAGA: Oryginalny odpowiedź miał dodatkowe linie używając date np

GIT_AUTHOR_DATE=`date --date=$GIT_AUTHOR_DATE` 

jednak nie jest to konieczne, ponieważ uchwyty wykorzystuje aktualną strefę czasową (włączając DST) jeśli nie podano. Dlatego wystarczy przyciąć strefę czasową.

+0

Nie wiem, co rozumie się przez "konwersję DST" tutaj, ale kiedy uruchomiłem go w zimie z TZ = Europa/Londyn, to cały czas przeliczałem na UTC (+0000) i nie radziłem sobie z faktem niektóre z tych ostatnich miały miejsce ostatniego lata, kiedy Londyn korzystał z British Summer Time. (Próbowałem uporządkować repozytorium, do którego zobowiązałem się z serwera w USA, który był ustawiony na strefę czasową w USA i wolałbym, aby mój lokalny czas brytyjski był zapisywany w zatwierdzeniu). –