커밋 타임스탬프를 변경하지 않고 gitrebase
당신이 이 일을 할 수 있습니까?git rebase커밋 타임스탬프를 보존하는 동안?
저는 그 결과 새로운 지점에 반드시 연대순으로 커밋 날짜가 있는 것은 아니라고 생각합니다.이론적으로 가능합니까? (예: 배관 명령을 사용합니다. 여기서 궁금할 뿐입니다.)
이론적으로 가능하다면 타임스탬프를 변경하는 것이 아니라 rebase를 사용한 실습이 가능한가요?
예를 들어 다음과 같은 트리가 있다고 가정합니다.
master <jun 2010>
|
:
:
: oldbranch <feb 1984>
: /
oldcommit <jan 1984>
이제, 내가 베이스를 바꾸면,oldbranchmaster커밋 날짜가 1984년 2월에서 2010년 6월로 변경됩니다.커밋 타임스탬프가 변경되지 않도록 해당 동작을 변경할 수 있습니까?결국 나는 다음을 얻게 될 것입니다.
oldbranch <feb 1984>
/
master <jun 2010>
|
:
그게 말이 됩니까?이전 커밋이 부모로서 더 최근 커밋을 갖는 이력을 갖는 것이 허용됩니까?
2014년 6월 업데이트: David Fraser는 댓글에서 옵션을 사용하여 "Git 분기를 재배치하는 동안 타임스탬프 변경"에도 자세히 설명된 솔루션을 언급했습니다.--committer-date-is-author-date(commit 3f01ad6에서 2009년 1월에 처음 도입되었습니다.
로 고는 다음과 .
--committer-date-is-author-date옵션은 작성자 타임스탬프를 남기고 커밋 타임스탬프를 원래 작성자 타임스탬프와 동일하게 설정하는 것으로 보이는데, 이는 OP Olivier Verdier가 원하는 것입니다.올바른 날짜의 마지막 커밋을 찾아 다음 작업을 수행했습니다.
git rebase --committer-date-is-author-date SHA
참조:
--committer-date-is-author-date기본적으로 명령어는 전자 메일 메시지의 날짜를 커밋 작성자 날짜로 기록하고 커밋 작성 시간을 커밋 날짜로 사용합니다.
이렇게 하면 작성자 날짜와 동일한 값을 사용하여 커밋 날짜에 대해 거짓말을 할 수 있습니다.
(), 파일: Git 2.29 (2020년 4분기), Gitrebase--committer-date-is-author-date또는--ignore-date또한 다음과 같이 작동합니다.
- rebase 리베이스)
rebase -i/rebase --interactive) - commit 커밋)에 대해
git rebase --root)
"Git 분기의 기본을 변경하는 동안 타임스탬프 변경"을 참조하십시오.
(원답, 2012년 6월)
당신은 시도할 수 있어요, 상호 작용하지 않는 리베이스를 위해.
위 , 2020년 , (사용자: Git 2.29, 2020년 4월)
git rebase --ignore-date
(이 SO 답변에서)
이 정보는 에 전달되며, 에 다음 사항이 언급됩니다.
--ignore-date
기본적으로 명령어는 전자 메일 메시지의 날짜를 커밋 작성자 날짜로 기록하고 커밋 작성 시간을 커밋 날짜로 사용합니다.
이렇게 하면 커밋 날짜와 동일한 값을 사용하여 작성자 날짜에 대해 거짓말을 할 수 있습니다.
의 경우 이 선택사항은 " --interactive 선택사항과 호환되지 않음"입니다.
이전 커밋 날짜의 타임스탬프를 마음대로 변경할 수 있기 때문에 원하는 커밋 날짜 순서로 Git 내역을 구성할 수 있으며 미래로 설정할 수도 있습니다!
올리비에가 그의 질문에서 언급했듯이, 저자의 날짜는 절대 기본적으로 변경되지 않습니다.
Pro Git Book에서:
- 저작자는 그 저작물을 최초로 작성한 사람,
- 반면에 커미셔너는 작업을 마지막으로 적용한 사람입니다.
프로젝트에 패치를 보내고 핵심 구성원 중 한 명이 패치를 적용하면 둘 다 크레딧을 받을 수 있습니다.
이 경우 올리비에가 언급한 것처럼 특히 명확하게 하기 위해:
제가 이루려고 했던 것과 반대되는 일을 합니다!
"commit timestamps!"로합니다.
그래서 제 질문에 대한 정답은 다음과 같습니다.
다음 이후로 아무것도 하지 마십시오.git rebase기본적으로 작성자의 타임스탬프는 변경되지 않습니다.
딜런 영이 논평에서 덧붙인 것처럼, "기트레베이스 동안 해시를 사용하여 충돌하는 커밋을 식별하는 방법은 무엇입니까?":
SEQUENCE_EDITOR의 variable과 rebase interactive를 합니다.todo합니다.GIT_COMMITER_DATE에서 각 전의todo.원래 커밋 목록을 가지고 있기 때문에(찾기 위해 git 내부를 해킹할 필요가 없음) 조금 덜 귀찮지만, 전체 목록을 한 번에 처리해야 하기 때문에 조금 더 많은 작업이 필요합니다.–
원래 커밋을 식별할 수 있게 되면 다음과 같은 작업을 수행할 수 있습니다.
git rebase -x 'GIT_COMMITTER_DATE="git show -s --format=%ci ``get_current_commit``" git commit --amend --no-edit
커밋 날짜를 이미 망쳐 놓고(아마도 리베이스로) 해당 작성자 날짜로 재설정하려는 경우 다음을 실행할 수 있습니다.
git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'
Von C에 대한 결정적인 질문은 제가 무슨 일이 일어나고 있는지 이해하는 데 도움이 되었습니다. 당신의 기본을 바꿀 때, 커미셔너의 타임스탬프는 변경되지만 저자의 타임스탬프는 변경되지 않습니다. 갑자기 모든 것이 이치에 맞습니다.그래서 제 질문은 사실 충분히 정확하지 않았습니다.
답변은 rebase가 실제로 작성자의 타임스탬프를 변경하지 않는다는 것입니다(그러기 위해 아무것도 할 필요가 없습니다). 이것은 저에게 완벽하게 맞습니다.
기본적으로 Gitrebase는 커밋의 타임스탬프를 새 커밋이 작성된 시간으로 설정하지만 작성자의 타임스탬프는 그대로 유지합니다.대부분의 경우 이 동작은 원하는 동작이지만 일부 시나리오에서는 커미셔너의 타임스탬프도 변경하지 않습니다.어떻게 하면 그것을 이룰 수 있을까요?자, 여기 제가 평소에 하는 요령이 있습니다.
먼저, 기준을 변경하려는 각 커밋에 고유한 커밋 메시지와 작성자 타임스탬프가 있는지 확인합니다(여기가 트릭 니즈 개선점이며, 현재는 제 니즈에 맞습니다).
기본 재배치 전에 파일로 재배치될 모든 커밋의 커밋 타임스탬프, 작성자 타임스탬프 및 커밋 메시지를 기록합니다.
#NOTE: BASE is the commit where your rebase begins
git log --pretty='%ct %at %s' BASE..HEAD > hashlog
그런 다음 실제 리베이스가 발생하도록 합니다.
마지막으로, 다음을 사용하여 커밋 메시지가 동일한 경우 현재 커밋의 타임스탬프를 파일에 기록된 타임스탬프로 바꿉니다.git filter-branch.
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%at %s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_COMMITTER_DATE=$__date || cat'
체크아웃하세요.git reflog 아면전부니.refs/original/심판을 보다
또한 작성자의 타임스탬프와 유사한 작업을 수행할 수 있습니다.
예를 들어 일부 커밋에 대한 작성자의 타임스탬프가 순서가 맞지 않고 이러한 커밋을 재정렬하지 않고 작성자의 타임스탬프만 순서대로 표시하면 다음 명령이 도움이 됩니다.
git log --pretty='%at %s' COMMIT1..COMMIT2 > hashlog
join -1 1 -2 1 <(cat hashlog | cut -f 1 | sort -nr | awk '{ print NR" "$1 }') <(cat hashlog | awk '{ print NR" "$0 }') | cut -d" " -f2,4- > hashlog_
mv hashlog_ hashlog
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_AUTHOR_DATE=$__date || cat'
진짜 해결책은 레딧에서 나온 것 같습니다.여기에 약간 증가된 것이 있습니다.
git -c rebase.instructionFormat='%s%nexec GIT_COMMITTER_DATE="%cD" git commit --amend --no-edit --allow-empty --allow-empty-message' rebase -i
post-rewrite갈고리
이 후크는 모든 작업에 사용할 수 있습니다.git rebase,git pull --rebase그리고.git commit --amend.
.git/continue/post-continue
set -eu
echo post-rewrite
if [ ! "${CIROSANTILLI_GITHOOKS_DISABLE:-0}" = 1 ]; then
declare -a olds
declare -A oldnew
while IFS= read -r line; do
echo "$line"
old="$(echo "$line" | cut -d ' ' -f1)"
new="$(echo "$line" | cut -d ' ' -f2)"
oldnew[$old]="$new"
olds+=("$old")
news+=("$new")
done
git reset --hard "${news[0]}~"
for old in "${olds[@]}"; do
new="${oldnew[$old]}"
git cherry-pick "$new" &>/dev/null
olddate="$(git log --format='%cd' -n 1 "$old")"
CIROSANTILLI_GITHOOKS_DISABLE=1 \
GIT_COMMITTER_DATE="$olddate" \
git commit \
--amend \
--no-edit \
--no-verify \
&>/dev/null \
;
done
echo
fi
GitHub 업스트림.
다음을 잊지 마십시오.
chmod +x .git/hooks/post-rewrite
은 이은좋방다니입법은을 하는 좋은 입니다.--committer-date-is-author-date다른 사용자가 구성을 패치하여 기본값으로 설정하기 전에 선택한 리포지토리에서 기본값으로 설정합니다.
또한 다음과 같은 환경에서도 작동합니다.--committer-date-is-author-date에 노출되지 않은 것처럼 보이는.git pull --rebase.
참고 항목:
- 'gitrebase --continue'에 적용되는 깃 후크는 무엇입니까?
man githooks
Git 2.19, Ubuntu 18.04에서 테스트되었습니다.
다음은 제 경우에 사용한 명령입니다.
GIT_AUTHOR_EMAIL=xaionaro@dx.center git rebase --root -x "bash -c 'git commit --amend --reset-author -CHEAD --date=\"\$(git show --format=%ad -s)\"'"
여기서git show --format=%ad -s와 현재날추니다합출를짜를 합니다.--date다시 시작합니다.그리고.rebase --root -x합니다.bash -c 'git commit --amend --reset-author -CHEAD --date="$(git show --format=%ad -s)"'각 커밋마다
언급URL : https://stackoverflow.com/questions/2973996/git-rebase-without-changing-commit-timestamps
'programing' 카테고리의 다른 글
| phpMyAdmin에서 db 권한을 볼 수 없음 (0) | 2023.06.30 |
|---|---|
| 안드로이드에서 투명한 활동을 만들려면 어떻게 해야 합니까? (0) | 2023.06.30 |
| 판다 데이터 프레임에서 튜플 열을 분할하려면 어떻게 해야 합니까? (0) | 2023.06.30 |
| 단일 개정판의 git 로그 (0) | 2023.06.30 |
| c/c++ 컴파일러는 2의 거듭제곱 값에 의한 상수 분할을 시프트로 최적화합니까? (0) | 2023.06.30 |