Git:批量更改提交日期

ldxq2e6h  于 2023-01-24  发布在  Git
关注(0)|答案(4)|浏览(335)

当我需要更改各种提交的提交日期时,我使用交互式rebase,并逐个更改它们。
我怎么能在一个命令中改变它们呢?换句话说,我需要对交互式变基中列出的所有提交应用一个给定的命令。
谢谢

3vpjnl9f

3vpjnl9f1#

过滤器-回收

git filter-branch已弃用。请改用git filter-repo。您需要安装它。
这里有一个关于如何使用git-filter-repo修改提交日期的excellent article,它很好地解释了--commit-callback的概念。
∮一个非常简单的例子∮
让我们将所有提交日期的时区重置为零。

# Save this as ../change_time.py
def handle(commit):
    "Reset the timezone of all commits."
    date_str = commit.author_date.decode('utf-8')
    [seconds, timezone] = date_str.split()
    new_date = f"{seconds} +0000"
    commit.author_date = new_date.encode('utf-8')

handle(commit)
# You need to be in a freshly-cleaned repo. Or use --force.
git clone <...> your_repo
cd your_repo
# First just a dry run.
git filter-repo --dry-run --commit-callback "$(cat ../change_time.py)"
# And now do it for real
git filter-repo --commit-callback "$(cat ../change_time.py)"
lkaoscv7

lkaoscv72#

改编自https://stackoverflow.com/a/750182/7976758

#!/bin/sh

git filter-branch --env-filter '
GIT_AUTHOR_DATE="2000-12-21 23:45:00"
GIT_COMMITTER_DATE="`date`" # now
export GIT_AUTHOR_DATE GIT_COMMITTER_DATE
' --tag-name-filter cat -- --branches --tags

请参见https://git-scm.com/docs/git-filter-branch以获取参考。

dauxcl2d

dauxcl2d3#

git rebase支持--exec选项,该选项将执行此操作。
-x <cmd>
--exec <cmd>
在 最终历史记录中创建提交的每一行后面附加“exec“。将被解释为一个或多个shell命令。任何失败的命令都将中断变基,退出代码为1。

icnyk63a

icnyk63a4#

过滤器-回收

在另一个答案中,建议将代码保存到文件. py中,并使用git filter-repo --commit-callback "$(cat ../<your file name>.py)"运行它,但在我的情况下,它忽略了所有空格,在python中会破坏语法。对我来说,直接将其粘贴到命令中。我使用Windows,在PowerShell上测试,初学者在这些事情上。

更高级的示例

根据包含给定字符串的提交设置新的提交日期。但是注意,除非你有很好的理由,否则你不应该更改日期!

if(b'[structural-programming]' in commit.message):
    base_date = datetime(2021,1,1,0,0,0)
    print(commit.message,' new date: ',base_date)
    commit.committer_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
    commit.author_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
elif(b'[intro-into-programming]' in commit.message):
    base_date = datetime(2021,1,2,0,0,0)
    print(commit.message,' new date: ',base_date)
    commit.committer_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
    commit.author_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
else:
    base_date = datetime(2021,1,3,0,0,0)
    print(commit.message,' new date: ',base_date)
    commit.committer_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
    commit.author_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')

以及如何在控制台中使用:

git filter-repo --commit-callback "                            
 [seconds, timezone] = commit.committer_date.decode('utf-8').split()
 
 if(b'[structural-programming]' in commit.message):
     base_date = datetime(2021,1,1,0,0,0)
     print(commit.message,' new date: ',base_date)
     commit.committer_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
     commit.author_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
 elif(b'[intro-into-programming]' in commit.message):
     base_date = datetime(2021,1,2,0,0,0)
     print(commit.message,' new date: ',base_date)
     commit.committer_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
     commit.author_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
 else:
     base_date = datetime(2021,1,3,0,0,0)
     print(commit.message,' new date: ',base_date)
     commit.committer_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
     commit.author_date = f'{int(datetime.timestamp(base_date))} +0100'.encode('utf-8')
 "

相关问题