Tech Note

git 커밋 시간 변경하기

Samgim 2017. 5. 8. 01:34


사실 자주 쓰면 안되는 건데, 쓰고 싶을 때가 있다(...)



출처는 http://stackoverflow.com/questions/454734/how-can-one-change-the-timestamp-of-an-old-commit-in-git 


git filter-branch -f --env-filter \

    'if [ $GIT_COMMIT = 해쉬값 ]

     then

         export GIT_AUTHOR_DATE="Mon May 1 08:45 2017 +0900"

         export GIT_COMMITTER_DATE="Mon May 1 08:45 2017 +0900"

     fi'



이렇게 변경하면 되는데, 

filter-branch 가 해당 브랜치의 모든 history를 뒤지기 때문에, 브랜치의 history가 길 경우에는 굉장히 오래 걸린다.

커밋 하나 시간 변경하는데 꽤 오래 걸려서 섬짓 할 수 있다.


-f 를 해주는 이유는 ref 를 변경하게 되는데, ref 에 대해서는...

https://git-scm.com/book/ko/v1/Git%EC%9D%98-%EB%82%B4%EB%B6%80-Git-%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4


이걸 참고하도록 하자. 자세히 적자니 귀찮다(...)

어쨌든, 여러 개의 커밋을 변경할 때는 ref 가 임시로 저장되는데, 한 커밋을 변경하면 이 임시로 ref 가 저장된다. 

그 후에 다른 커밋을 변경하면 이 ref 가 레알 ref가 아니라 임시 ref 라는 메시지를 뱉으며 변경 실패한다.

뭐, 보통 ref 까지 뒤지면서 엄청 git을 깊게 쓰는 경우는 없으니 (그리고 있어서도 안되니) -f를 걸어줘도

내 실험 내에서는 괜찮았다(...)



다만, 브랜치에 여러 개의 커밋이 있을 때, 마지막 커밋이 아니라 중간에 있는 커밋의 시간을 변경하면

변경한 커밋 이후의 커밋들의 해쉬값이 모두 바뀐다(!)

이건 주의해야할 듯.




참고로 


GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend


이런 방법도 있는데, 

이건 커밋 자체의 시간을 변경하는게 아니라 변경된 시간으로 새로운 커밋을 생성하는 거라서

이 편이 안전할 듯.



하지만 역시 중간에 있는 커밋을 바꾸고 싶을 때가 있으니(...)

하지 말아야 하지만 쓸 때는 주의주의주의.....