1

我有一个目录 src 和一个目录 src_ref ,其中包含 src 的内容,但以多种方式重构。我将 src_ref 重命名为 src 并将 src 重命名为 src_dep 并在git add -A. git 所做的事情毫无意义,我不了解 git 的内部结构来理解它。这是发生的确定性行为:

In the diff log it makes no mention of the directory src_dep.
The files now in src form src_ref are commited as new files. 

在尝试切换到不同的分支后,它说:

fatal: Out of memory? mmap failed: File exists

但是,它部分检查了分支。再次执行该命令当然会指定工作目录中的文件子集已更改。

提交这些更改(由于分支的部分签出)仍然会导致fatal: Out of memory? mmap failed: File exists尝试重新签出另一个分支。

关于提交似乎没有对 src_dep 的任何引用这一事实的相关部分:git reset --hard HEAD~对提交进行操作时,仍然会重新创建 src_dep 目录,尽管它似乎没有出现在上面指定的差异中。

似乎这种类型的损坏对于 git 的使用是灾难性的(在我的情况下,因为我对处理损坏数据并因此完全停止使用它的技术没有兴趣),因为似乎解决这个问题的唯一合理方法将重新创建失去所有分支的 git 存储库,或者:

Save the changes from the commit that caused the fatal: Out of memory? mmap failed: File exists
git reset --hard HEAD~
Apply the changes manually again and pick a different way to change src_ref to src

问题是:

  1. 逻辑上正确的差异是文件从 src_ref 到 src 的移动以及文件从 src 到 src_dep 的移动。这当然不会在 src 中创建大量文件时发生,其中一些文件从 src_ref 移动到 src 并且在 diff 中根本没有对 src_dep 的引用。git 是否有可能通过一些差异设置来实现正确的逻辑?
  2. 关于将包含略微修改的文件的目录更改为已提交的目录,这是记录和预期的行为吗?即,我希望能够将 src_ref 更改为 src,并优先拥有不会中断/损坏的存储库版本(即,如果有逻辑上正确的移动会很好,但我会满足于拥有存储库未损坏)。
  3. 解决此问题的操作模式是什么,因为我确实打算将这些重复的重构目录最终需要作为新的 src 提交?
4

1 回答 1

0

每次更改一个文件夹,提交每个更改。src->src_dep 提交然后 src_ref->src

于 2013-08-05T20:43:29.373 回答