如何添加描述 git filter-repo --path-rename 的提交?

问题描述 投票:0回答:1

我想重命名 Git 中的文件和文件夹,使用新名称保留提交历史记录

git filter-repo --path-rename
几乎满足了我的需要,除了我想要一个描述重命名的提交

由于

git filter-repo --path-rename
没有添加这样的提交,所以我想到首先执行
git filter-repo --path-rename
,然后对重命名的文件执行
git commit
。但是,Git 似乎(据我所知)不允许我暂存未更改的文件,因此我无法真正对重命名的文件执行
git commit

接下来我将尝试使用 git-filter-repo 文件名回调来查看它是否可用于添加新提交。但我想我还要问是否有人知道如何

git filter-repo --path-rename
添加描述重命名的提交?

git git-filter-repo
1个回答
0
投票

我想重命名 Git 中的文件和文件夹,并使用新名称保留提交历史记录。 git filter-repo --path-rename 几乎满足了我的需要,除了我想要一个描述重命名的提交。

您可以添加一个空提交,

git commit --allow-empty
,描述更改。但这不会让 Git 知道有一个重命名,只是任何碰巧发现该提交的人都知道。不是很有用。

并且,正如评论中所指出的,这违背了

git filter-repo
的要点,这使得该文件看起来像是在所有历史中都以这种方式命名的。如果您想让人们知道有重命名,您不妨做一个
git mv

但是我们在评论中得到了真正的问题...

问题是我想重命名一个文件,(1)向文件的提交历史记录添加提交,(2)用新名称保留文件的提交历史记录。 git mv 执行 (1) 但不执行 (2),而 git filter-repo --path-rename 执行 (2) 但不执行 (1)。

我正在开发的应用程序是一个工具,可将具有更改历史记录的文件从跟踪重命名的 SCM 移动到 Git。因此,我需要(希望)尽可能模拟 Git 中的重命名跟踪。

我很遗憾地说,你正在逆流而上。如您所知,Git 不存储重命名。在 Git 中,一个文件有两部分。其内容存储为 blob 对象,其路径和权限存储为树对象。 Git 将它们视为两个独立的事物。试图保留以前系统的所有功能是一种反模式。您必须适应 Git 的启发式方法。

有助于启发式的一件事是重命名一次提交中的文件,并在另一次提交中编辑它们。更改名称,然后更改内容。避免在一次提交中同时更改名称和内容。

通常重命名对于合并和代码考古来说是很重要的,比如

git blame
git log
git diff
。 Git 有许多启发式方法来查找重命名,并且这些都是可配置的。

默认的

ort
合并策略将查找重命名。您可以使用
merge.renames
(默认情况下启用)、merge.directoryRenames(默认会导致冲突)和 merge.renameLimit 进行配置。

git-diff
类似的选项

git-log
git-blame
-C
-M
可以更加努力地寻找副本。不幸的是这些缺乏配置选项。对于单个文件,有
log.follow
。我使用别名...

# Ignore whitespace, find copies and moves harder, show the line number of the original commit
archeology = blame -w -C -M -n

# Find copies and moves, and follow the renames of individual files.
logfile = log --follow -C -M
© www.soinside.com 2019 - 2024. All rights reserved.