我什么时候在git中移动文件时提交? (Jgit)

时间:2016-06-10 14:58:17

标签: java git jgit

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

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

mv oldname newname
git add newname
git rm oldname
当要更改文件夹或文件名时,

是我想要做的。 所以我使用Java FileUtils移动文件, 添加新文件/文件夹并使用以下命令删除旧文件/文件夹:

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

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

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

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

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

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

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

如果两次更改都发生在同一次提交中,则此启发式方法仅识别重命名。如果删除文件,提交,然后使用其他名称添加文件并再次提交,Git会将其视为单独删除和添加不相关的文件。

请注意,重命名检测是可选的,默认情况下工具可能不会这样做。使用git log,您需要使用-M选项,或执行git config --bool diff.renames true

答案 1 :(得分:1)

我不熟悉JGit,但是当您运行命令时,您的Java代码可能应该反映Git在界面下实际做的事情。既然你已经这样做了,我就没有看到任何问题。我会确保整个重命名操作出现在一次提交中。想要这样做有几个原因。您可能希望在某个时候恢复重命名。如果您只有一次提交,则可以通过git revert轻松完成此操作。

关于保留历史记录,重命名文件会更难跟踪历史记录but not impossible,例如

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