2008-12-15 14 views
45

Potrzebuję dokonać pewnych commitów używając Git, ale chciałbym aby znacznik czasu w git-log był w przyszłości.git commit - ustawianie znaczników czasu w przyszłości

Jak mogę zrobić commit w git, który powoduje, że przyszły znacznik czasu rejestruje się w git-log?

+0

Czy próbowałeś zmienić zegar? =) Myślę, że to powinno działać lokalnie, ale nie wiem, co się stanie, gdy inni się połączą. – Kieveli

+3

Znaczniki czasu nie mają znaczenia przy scalaniu. – Dustin

Odpowiedz

67

Powinieneś trochę poczekać.

Albo można to zrobić:

/tmp/x 604% env GIT_AUTHOR_DATE='Wed Dec 19 15:14:05 2029 -0800' git commit -m 'future!' 
[master]: created 6348548: "Future!" 
1 files changed, 1 insertions(+), 0 deletions(-) 

/tmp/x 605% git log 

Author: Dustin Sallings <[email protected]> 
Date: Wed Dec 19 15:14:05 2029 -0800 

    Future! 

Uwaga że jest zarówno data autor i data committer, więc należy ustawić właściwą (lub obu).

+7

Działa również z datą w formacie ISO 8601: "2029-12-19 15:14:05 -0800". Lubię to. – sunny256

+2

Jaka jest różnica między GIT_AUTHOR_DATE a GIT_COMMITTER_DATE? – Blago

+4

@Blago: W git, autor (osoba, która napisała zmianę) i przekazujący (osoba, która wprowadziła zmianę w repozytorium) są śledzeni osobno. Pozwala robić wiele wspaniałych rzeczy. – Dustin

-5

Czy mogę zapytać, dlaczego chciałbyś to zrobić?

Jeśli nie chcesz zmieniać zegara, proponuję utworzyć skrypt do wykonania zatwierdzenia i użyć Harmonogramu systemu Windows (lub innego równoważnego dla systemu operacyjnego) do uruchomienia skryptu w momencie, gdy chcesz zatwierdzić być.

+1

Dobry pomysł. W systemach typu Unix możesz użyć polecenia "at" (zobacz "man at" w celu użycia). –

10

Jeśli chcesz zachować rzeczywistą zmianę aktualne w momencie dodawania projekt git, można to zrobić z

env GIT_AUTHOR_DATE="`ls -rt *.cpp|tail -1|xargs date -u -r`" git commit -m "Old sources retaining old change-dates of last changed 
file: `ls -rt *.cpp|tail -1`, actual commit date: `date`" 

To popełnić ze zmianą-data ostatniego zmianom * .cpp- plik i miły komunikat wyjaśniający faktyczną datę zatwierdzenia.

48

Można zmienić commit, przykład z roku 2037:

git commit --amend --date="Wed Feb 16 14:00 2037 +0100" 

Próbowałem roku 2038 zbyt ale potem dostałam zerowej wartość daty.

+11

Cokolwiek do 19 stycznia 3:14:07 2038 UTC powinno działać. http://en.wikipedia.org/wiki/Year_2038_problem – Arrowmaster

+0

Zmiana zatwierdzenia zmienia tylko datę przekazania. Git śledzi 2 daty: zatwierdzenie i datę autora.Data autora pozostanie jako oryginał przez zmianę lub dowolne inne polecenie git, które edytuje zatwierdzenia (np. Rebase i cherry-pick). – Zombies

+0

@ Zombies wrong: 'git log' pokazuje domyślnie' GIT_AUTHOR_DATE', a nie 'GIT_COMMITTER_DATE'. Możesz sprawdzić za pomocą 'git log --pretty = fuller' który pokazuje oba. Zmiana zatwierdzenia z opcją '--date' zmienia datę_authora_. Zmiana tej opcji bez tej opcji zmienia tylko _codzienną datę_, ponieważ ponownie tworzy zatwierdzenie. – Tim

2

Łącząc odpowiedź Hugo (1) informacji znaleźć tutaj (2) i podrzucając w pewnym sed, mam to:

alias newest="find . -path ./.git -prune -o -type f -exec stat -c \"%y %n\" '{}' + | sort -r | head -1 | sed s#'.*\./'##" 
GIT_AUTHOR_DATE="$(newest | xargs date -u -r)" GIT_COMMITTER_DATE="$(newest | xargs date -u -r)" git commit -m "Old sources retaining old change-dates of last changed file: $(newest), actual commit date: $(date)" 

Główną różnicą jest to, że ta wersja nie rekurencyjnego wyszukiwania, więc otrzymujesz najnowszy plik w dowolnym miejscu drzewa, ale celowo pomija katalog .git.

Możesz oczywiście upuścić jedną ze zmiennych daty tutaj i używam dość najnowszej wersji bash (4.2.37 (1) -release), więc notacja $() może nie działać dla ciebie (zamiast tego zastąp go backtickami (`)).

+0

twoje 'najnowsze | xargs data -u -r' umiera na spacje w nazwie pliku. sed w repozytorium FSF obsługuje linie zakończone nulem, co sprawiłoby, że cały potok byłby bezpieczny, ale do tego czasu użyłbym -d \\ n przy nazwach plików xarg. . . . 'znajdź. -name .git -prune -o -type d -o -print0 | xargs -0 ls -dt | sed q' jest krótszy – jthill