为Git存储库中的所有提交重命名文件

为Git存储库中的所有提交重命名文件,git,Git,我想为Git存储库中的所有提交重命名一个文件。以下是我尝试过的: git filter-branch --index-filter 'git mv -k <old name> <new name>' HEAD Git在尝试第一次提交时会出错,比如说“源代码不好…”。我最终通过使用以下命令解决了最初的问题: git过滤器分支--树过滤器' 如果[-f];然后 mv fi’——力头 对于任何对重命名文件感兴趣的人来说,git-rebase-i可以很好地工作。在rebase中

我想为Git存储库中的所有提交重命名一个文件。以下是我尝试过的:

git filter-branch --index-filter 'git mv -k <old name> <new name>' HEAD

Git在尝试第一次提交时会出错,比如说“源代码不好…”。

我最终通过使用以下命令解决了最初的问题:

git过滤器分支--树过滤器'
如果[-f];然后
mv
fi’——力头

对于任何对重命名文件感兴趣的人来说,
git-rebase-i
可以很好地工作。在rebase中包含创建文件的提交,用
edit
标记它,然后重命名文件。Git将正确地将下一次提交应用于此文件。

您将用它来更改历史记录。是的,这就是筛选器分支的要点。我知道“筛选器分支”就是要重写历史记录,这正是我想要的。您可以尝试使用
--tree filter
?我知道它会比只索引慢,但如果它能工作的话……是的,我确实尝试过“树过滤器”,比如:$git filter branch——树过滤器'mv
'头问题是我想重命名的文件从第一次提交时就不存在,因此git错误为“mv:cannot stat
':没有这样的文件或控制器”如何测试文件在“mv”命令之前是否存在?有关使用
--索引过滤器
的解决方案,请参阅注意
git mv
不能与索引过滤器一起使用,因为
git mv
需要一个工作副本,而您只能通过树过滤器获得该副本。请将
if[-f]
替换为
if[-d]
重命名目录而不是文件。这样做有效,但每次提交时都需要手动重命名文件。如果是一次提交,那没什么大不了的,但是一个过滤器分支会在一个过程中清理整个分支当我尝试@STW时,我只是不得不在创建它的一次提交中重命名该文件,它真的让我惊讶(以一种好的方式),git足够聪明,可以在重命名后的文件中应用修改,如果您只需要返回一两次提交,这是一种更快、更安全的方法。明智地选择你的武器!是的,git是Epic,这会从您的头创建一个新的提交,并重命名文件,但是如果您查看历史记录,您会发现该文件仍然具有旧名称,也就是说,如果您
使用相同的文件将
重基到另一个分支上,即使您将新提交与重命名的文件@MihaiSoloi一起包含,也不会有任何帮助
git filter-branch --index-filter 'git mv <old name> <new name>' HEAD`