英文:
How to use git rebase to edit both author/committer and timestamps at the same time?
问题
我一直在尝试重写Git仓库的历史,以整合提交、删除大文件和许多其他更改。git filter-branch
不被推荐作为工具,我想手动重写历史以获得更精确的控制。
我遇到了一个重大障碍。当我重写提交时,重写的提交显示为由我提交(作者编写并由我提交),而我不想要这样。
我可以通过在每次rebase之前运行git config user.name
和git config user.email
来绕过这个问题。这使它看起来像是原始作者提交的。
到目前为止还好,但是当我这样做时,提交者的时间戳总是“现在”。我可以使用git commit --amend --date
更改作者时间戳,但提交者时间戳无法更改。
我可以使用选项--committer-date-is-author-date
,这样可以工作(尽管会更改时区,这不是我喜欢的)……但似乎在交互式rebase中无效,它什么也不做。自动rebase不允许我使用git config user.name/email
使提交的原始作者独立显示。
我尝试使用set GIT_COMMITTER_DATE=
后跟git commit --amend --no-edit
。一开始它是有效的,但突然间出于未知的原因停止工作。现在它根本不起作用 - 提交者的时间戳不受影响。
这让我面临一个选择,要么将我添加为提交者,要么在具有多年历史的项目中具有不准确的“现在”时间戳。
我正在寻找一种方法,使查看历史记录的人可以看到原始作者和原始时间戳(或我指定的任何时间戳),并且与交互式rebase兼容,因为我将进行大量的rebase,因此整个历史记录将从过去越来越远的地方重写。
是的,这可能是一个疯狂的项目,但是否有人有关于如何实现这一目标的建议?
(是的,我正在一个单独的分支上进行此操作。在完成项目后,我将强制推送到主分支。)
编辑:当我尝试在rebase的一部分设置环境变量时会发生以下情况:https://gyazo.com/d6189169809023e2b722fedc03169011
(使用以下输入:https://gyazo.com/8a38c243dac215c4a333394ef8fae78e)
我可以使用CMD设置环境变量,但Git无法做到:https://gyazo.com/39644a586b78cb933988e90880c67286
我正在使用Windows 10 Home Edition。
英文:
I've been trying to rewrite the history of a Git repository to consolidate commits, remove large files, and many other changes. git filter-branch
is not recommended as a tool and I want the precision of rewriting the history manually.
I've run into a major obstacle. When I rewrite the commits, the rewritten commits show up as being committed by me (author authored and I committed), which I don't want.
I am able to get around this by running git config user.name
and git config user.email
before picking each commit in rebase. This makes it look like the original author committed it.
So far so good, but when I do this the committer timestamp is invariably "now". I can change the author timestamp with git commit --amend --date
, but the committer timestamp is unchangeable.
I can use the option --committer-date-is-author-date
, and that works (although it changes the timezone, which I don't like)...but seemingly not with an interactive rebase, where it does nothing. The automatic rebase does not permit me to use git config user.name/email
to make the original author of the commit show up by themselves.
I have tried using set GIT_COMMITTER_DATE=
followed by git commit --amend --no-edit
. It was working at first, but then suddenly stopped working for an unknown reason. It simply does nothing now - the committer timestamp isn't affected.
This leaves me with a choice of having me added to the commits as the committer, or having an inaccurate timestamp of "now" in a project with years of history.
I'm looking for a way so that people looking at the history can see the original author and the original timestamp (or whatever ones I specify), and that is compatible with interactive rebase because I'm going to be doing a lot of rebasing, so the entire history will be rewritten from further and further in the past.
Yeah, this might be a crazy project, but does anyone have any suggestions on how to accomplish this?
(Yes, I am doing this on a separate branch. I will force push to the main branch after I have finished the project.)
EDIT: This is what happens when I try to set the environment variables as part of the rebase: https://gyazo.com/d6189169809023e2b722fedc03169011
(Using the following input: https://gyazo.com/8a38c243dac215c4a333394ef8fae78e)
I can set the environment variables using CMD, but Git can't do it: https://gyazo.com/39644a586b78cb933988e90880c67286
I am using Windows 10 Home Edition.
答案1
得分: 1
根据文档 ,git commit
识别以下环境变量:
GIT_AUTHOR_NAME
GIT_AUTHOR_EMAIL
GIT_AUTHOR_DATE
GIT_COMMITTER_NAME
GIT_COMMITTER_EMAIL
GIT_COMMITTER_DATE
它们的值优先于配置值。
所以在你的情况下,你需要设置 GIT_COMMITTER_*
变量。
你可以使用以下命令检查 git
是否识别这些变量:
git var GIT_COMMITTER_IDENT
如果它没有识别它们,请确保你确实设置了它们。设置和读取环境变量取决于操作系统,并可能会有一些技巧。
英文:
According to the documentation git commit
recognizes the following environment variables
GIT_AUTHOR_NAME
GIT_AUTHOR_EMAIL
GIT_AUTHOR_DATE
GIT_COMMITTER_NAME
GIT_COMMITTER_EMAIL
GIT_COMMITTER_DATE
Their values take precedence over the configuration values.
So in your case you need to set the GIT_COMMITTER_*
variables.
You can check if git
recognizes the variables by using the command
git var GIT_COMMITTER_IDENT
If it does not recognize them, make sure you are actually setting them. Setting and reading environment variables is OS dependent and can be tricky.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论