重构Git存储库中的文件

时间:2013-07-15 18:08:51

标签: git tree repository directory-structure

我有一个Git存储库,其中包含以下文件夹结构:

allprojectfiles
--otherfolders
--source
----projectname
------projectname
---------git initilalized here
---------otherfolders
---------workingonthesefiles(bound to remote)

我是否可以重构项目以使 allprojectfiles 文件夹中的Git跟踪而不丢失历史记录?

2 个答案:

答案 0 :(得分:2)

Git跟踪树和Blob,而不是文件夹

Git唯一的文件夹跟踪功能是tree commits。因此,在一般情况下,您可以自由移动文件夹,Git只需将新树写入存储库。

我建议使用git mv在其他干净的工作树中暂存这些目录移动。如果您没有为提交暂存任何文件级更改,那么Git历史记录将正确地将您的新结构视为移动/重命名,而不是添加/删除操作。

答案 1 :(得分:1)

git不会显式跟踪重命名。一定要有一个提交除了移动之外什么都不做(在另一个路径上将是一个删除+添加)。然后git命令将自动检测移动,但有时(例如,如果两个文件具有相同的内容,但逻辑上你可以告诉哪一个被重命名)它将无法跟踪正确的历史记录。如果不重写历史,我不能避免这种情况。

这让我有了一个想法:使用git filter-branch,应该可以将文件夹提取到另一个位置,即新布局中的“正确”位置,然后重新添加其余位置。但这将完全改写你的历史。