Git可以重组我的文件夹而不丢失历史记录吗?

uhry853o  于 2023-08-01  发布在  Git
关注(0)|答案(4)|浏览(118)

我有一个git repo,目前只有我在使用它。我想把根文件夹下的所有文件和文件夹,并把它们放在一个新的文件夹。
当前结构:

main ->
  src
  res

字符串
新结构:

main ->
  app1
    src
    res


有没有什么方法可以做到这一点,这样文件就不会丢失它们的git历史记录?

h5qlskok

h5qlskok1#

TL;DR

继续:移动你的文件和目录。只要确保在目录重组的同一次提交中没有对文件进行任何编辑即可。

为什么有效

Git是一个内容跟踪器,而不是文件跟踪器。如果你移动或重命名文件,但没有对这些文件的内容做任何修改,那么Git就只需要rewrites the tree objects。文件blob不会被目录操作更改;目录位置信息被单独存储在树对象中。
实际的重命名检测由diffing the blobs and trees处理,并查找文件之间相似性的可配置百分比。这意味着Git不会直接存储移动或重命名;它根据提交之间的差异来计算它们。
所有这一切的结果是,您的历史记录不受特定文件名或目录结构的约束。这对于大多数用例来说都很好用,但与Bazaar这样的系统相反,它将重命名作为一级操作进行跟踪。

nhn9ugyo

nhn9ugyo2#

你可以只移动文件,Git会(或者应该)注意到你移动了文件。它将保留历史。
如果由于某种原因它没有注意到移动,你可以尝试使用--find-copies-harder选项进行比较。

gxwragnw

gxwragnw3#

当我移动或重命名一些文件时,我也丢失了历史记录。但我尝试访问TortoiseGitSourceTree应用程序。
当我尝试访问git bash命令时,我发现我可以看到历史记录。

$Git log

字符串
在网上花了几个小时的时间寻找原因后,我终于找到了答案。
Tortoise git默认设置,只显示实际的文件历史。我的意思是,如果你重命名或如果你移动任何文件或文件夹,你不能看到历史。要查看历史记录,您必须在TortoiseGit设置上单击下面的复选框。


的数据

kulphzqa

kulphzqa4#

虽然这是一个较老的问题,但我经历过标记的答案是不正确的。使用本机命令移动任何文件夹都将导致“删除”和“添加”。然而,git mv是你想要使用的。
https://git-scm.com/docs/git-mv
在上述情况下,将是

git mv "main\src" "main\app1\"

字符串

相关问题