我正在实施执行预定备份的机器人。 从前端,用户将能够更改存储备份的文件夹名称。
根据: 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中显示添加和删除的文件,如果过程有效,它会在日志中显示为移动吗?
感谢您的时间。
答案 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