在 git 中移动文件时何时提交? (Jgit)

When do I commit when moving files in a git? (Jgit)

我正在实施一个执行计划备份的机器人。 从前端,用户将能够更改存储备份的文件夹名称。

根据: What's the purpose of git-mv?

mv oldname newname
git add newname
git rm oldname

是我要更改文件夹或文件名时要执行的操作。 所以我使用 Java FileUtils 移动文件, 使用以下方法添加新的 file/folder 并删除旧的 file/folder:

git.add().addFilepattern(newName).call();
git.rm().addFilepattern(oldName).call();
git.commit().setAll(true).setMessage("Renamed group "+oldName+ " to " +newName).call();

主要目标是:保留移动文件的历史记录。

我应该在添加 'new' 文件之后再删除 'old' 之前提交吗?

我当前的操作顺序是否正常,并且在这两个操作之后提交是否应该保留更改历史记录?

我对 Git 以及日志记录的工作方式还很陌生,在 TortoiseGit 中它显示添加和删除的文件,如果进程有效,它会在日志中显示为移动吗?

感谢您的宝贵时间。

我不熟悉 JGit,但是您的 Java 代码应该可以反映当您 运行 您的命令时 Git 在界面下实际执行的操作.由于您已经这样做了,所以我看不出有任何问题。我会确保整个重命名操作出现在一次提交中。想要这样做有几个原因。您可能希望在某个时候恢复重命名。如果您只有一次提交,那么通过 git revert.

可以很容易地做到这一点

关于保留历史,重命名文件会使跟踪历史变得更加困难,but not impossible,例如

git log --follow ./path/to/file

Git实际上并不记录存储库中单个文件的历史;它将 整个存储库 的历史记录为一个单元。提交中没有任何内容明确说明修订版 2 中的 foo.txt 是修订版 1 中 bar.txt 的延续。相反,重命名是由检查存储库的工具推断的 — after 更改已提交 — 使用启发式方法,如果提交删除了一个文件并创建了另一个具有相似内容的文件,则旧文件将重命名为新文件。

如果两个更改都发生在同一提交中,则此启发式方法仅识别重命名。如果您删除一个文件,提交,然后用不同的名称添加回该文件并再次提交,Git 将把这看作是单独删除和添加不相关的文件。

请注意,重命名检测是可选的,默认情况下工具可能不会执行此操作。例如,对于 git log,您需要使用 -M 选项,或者执行 git config --bool diff.renames true.