github twitter email
Thay đổi thời gian commit trong Git
Mar 1, 2018
2 minutes read

Có rất nhiều lý do để bạn muốn thay đổi thời gian của các git commit, nếu bạn tìm được bài này thông qua Google, thì chắc hẵn bạn đã có một cái trong đầu rồi đấy. :)

Thay đổi lúc chưa commit

Nếu bạn chưa commit, và bạn muốn commit về quá khứ, hãy chỉ rõ --date cho nó.

git commit --date="Sun, 18 Mar 2018 22:03:06 +0700" 

Nếu bạn muốn thay đổi cả AuthorDate lẫn CommitDate thì bạn có thể dùng:

GIT_COMMITTER_DATE="Sat, 14 Dec 2013 12:40:00 +0000" git commit --date "Sat, 14 Dec 2013 12:40:00 +0000" 

Đơn giản phải không, trong đó giá trị date là định dạng ngày giờ RFC 5322 (VD: Sun, 18 Mar 2018 22:03:06 +0700), bạn cũng có thể dùng ISO 8601 (VD: 2018-03-18T22:16:23+0700).

Thay đổi commit vừa mới tạo

Lỡ commit rồi sao đây. Just --amend it!

git commit --amend --date "Sun, 18 Mar 2018 22:03:06 +0700"

# or use this to skip commit message edit
git commit --amend --date "Sun, 18 Mar 2018 22:03:06 +0700" -C HEAD

Thay đổi commit bất kỳ

Nếu bạn muốn thay đổi thời gian của commit, ví dụ f540b0b6d4da2f0c02fb717dbfd955bd3b958306 thành Sun, 18 Mar 2018 22:03:06 +0700. Hơi phức tạp tí, nhưng bạn có thể get thing done bằng dòng lệnh sau:

git filter-branch --env-filter \
"if test \$GIT_COMMIT = 'f540b0b6d4da2f0c02fb717dbfd955bd3b958306'
then
    export GIT_AUTHOR_DATE='Sun, 18 Mar 2018 22:03:06 +0700'
    export GIT_COMMITTER_DATE='Sun, 18 Mar 2018 22:03:06 +0700'
fi" && rm -fr "$(git rev-parse --git-dir)/refs/original/"

Ngoài ra Wiki của Linux kernel cũng giới thiệu một script với ý tưởng tương tự mà tiện hơn:

#!/bin/sh
#
# Rewrite all branches to modify the date of one specific commit in a repo.
#
# Sample date format: Fri Jan 2 21:38:53 2009 -0800
# ISO8601 and RFC822 dates will also work.
#
# Note: filter-branch is picky about the commit argument. As of 1.7.0.4,
# a hex ID will work, the symbolic revision HEAD will fail silently,
# and the usability of more exotic rev specs was not tested by the author.
#
# Copyright (c) Eric S. Raymond, 2010-08-01. BSD terms apply (if anybody really thinks that this
# script is long and non-obvious enough to fall under copyright law).
#
commit="$1"
date="$2"
git filter-branch --env-filter \
    "if test \$GIT_COMMIT = '$commit'
     then
         export GIT_AUTHOR_DATE
         export GIT_COMMITTER_DATE
         GIT_AUTHOR_DATE='$date'
         GIT_COMMITTER_DATE='$date'
     fi" &&
rm -fr "$(git rev-parse --git-dir)/refs/original/"

Tham khảo


go back


comments powered by Disqus