【问题标题】:Is it possible to re-arrange a repository and keep commit history of files that being re-allocated?是否可以重新安排存储库并保留重新分配的文件的提交历史记录?
【发布时间】:2021-10-15 20:46:39
【问题描述】:

我有一个大型 repo,它也连接到远程存储库。

我想重新安排它,但我不想将这些更改应用到当前目录,所以我创建了一个新的本地目录,一个新的空远程存储库。

我将当前的存储库镜像到新的空远程存储库。

然后,我将新的空目录连接到该 repostiroy 和 git pull 它。

现在我在本地新存储库中拥有了我的存储库的完整副本。

我想重新安排它,并将一些文件移入/移出当前目录。

问题是当我这样做时,然后commit & push 到远程存储库,我看到所有的提交历史在它移动到另一个位置后都被删除了。

当我编辑文件但将它们保留在当前位置,然后 commit & push 时,更改会上传并保留提交历史记录。

所以只有当我将文件移动到镜像存储库中的其他目录时才会出现问题。

即使我移动文件,有什么方法可以保留在镜像之前提交的提交历史记录?

谢谢。

【问题讨论】:

  • 关于 git 和重命名/移动的一般提示。您应该将文件的重命名和移动与文件内容的更改分开提交。例如,如果您正在执行 C#,它在文件中具有命名空间信息,通常对应于磁盘上的文件夹结构,如果您打算将文件移动到不同的文件夹/命名空间,那么您应该与修复命名空间分开提交移动里面。这样做的原因是,当文件被移动/重命名时,git 使用启发式方法来查找可能的来源,如果文件也发生了很大变化,它可能无法找到。
  • 是的,我知道。我只是想move他们,而不改变他们。而且,它仍然删除了在 mirror 之前所做的所有提交历史记录
  • 当你说“所有的提交历史都被删除”时,你能详细说明一下吗?你到底在看什么? Git 不会删除提交历史记录(这在很大程度上会破坏目的),但是如果您尝试通过重命名跟踪对特定文件的更改,则需要运行类似 git log --follow path/to/file 的内容(默认情况下,git log不跟随重命名)。
  • @larsks 好的,所以我的原始仓库位于 gitlab。我将它镜像到github 上的一个空仓库,然后将该仓库(从 gi​​thub 拉出)拉到一个空的本地 git 仓库。然后我试图重新安排它:移动一些文件。然后我提交并推送更改(这些文件的新文件位置)。然后,当我查看在 github 上所做的更改并查看这些文件的提交历史记录(这些文件已移出其原始位置)时,我看不到任何提交历史记录。在原始 repo 上的 mirror 之前创建的历史记录。
  • 我认为 github 没有跟踪文件重命名的机制。

标签: git github gitlab git-commit git-push


【解决方案1】:

非常简单。您创建一个保持不变的分支,checkout 您的主分支并执行更改。您不需要合并这些分支,您将在为此目的创建的分支中拥有旧的提交历史记录,而在您的主分支master 中拥有新的提交历史记录。

编辑

假设您在master 分支上。

执行:

git branch archive
git checkout archive
git push -u origin archive

这会在您的存储库中创建一个分支,然后在远程存储库中更新它。

现在,执行

git checkout master
mv myfolder1/myfile myfolder2
git add .
git commit
git push

查看

git log

你会看到旧的历史已经丢失。但是现在执行

git checkout archive
git log

您会看到,在归档分支中,您拥有文件移动之前的所有提交历史记录。

【讨论】:

  • 我听不懂你的回答。我会解释一下自己 - 是否可以在不同目录之间移动文件并仍然保留它们的提交历史?因为当我 git mv 将一个文件放入仓库中的另一个目录并推送更改时,githubgitlab 都显示该移动文件没有提交历史记录。
  • @NoobCoder 我已经编辑了我的答案,添加了更多细节。希望现在更清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 2017-08-17
相关资源
最近更新 更多