1

我之前也问过类似的问题,但是在对此事进行了相当彻底的分析之后,得出的结论git filter-branch是我正在寻找的主力。要么是那个,要么是一个自己做脏活的 shell 脚本.git(因为 git 无论如何都会把它的胆量作为其接口的一部分公开)。

我有一个项目目录,其中包括构建脚本和构建配置定义。更重要的是,它包含src文件夹,里面包含了项目的各种源代码,是一个 git 仓库。

我现在意识到整个项目文件夹应该是一个 git 存储库,而不仅仅是包含的源代码文件夹,但我希望保留我的源代码开发历史。事实上,我希望历史记录被完全重写,这样main.c 它就不会跟踪文件中的更改,而是跟踪文件中的相同内容更改src/main.c。然后我可以简单地从父文件夹(构建脚本所在的位置)移动文件并在 repo 中检查它们。

我不想打扰子树合并或 git 子模块,或者在存储库更改后必须合并或重置任何内容。我现在对 gits 内部有一些相当好的了解——提交指的是指与文件名配对的 blob 的树。

有了这些知识,我认为应该可以重写我的历史,在所有路径前面加上src/

我只是不想做额外的工作,这似乎filter-branch是要走的路,但我对示例和使用后的必要内务处理感到困惑。“原始参考”?另一个问题是我对“裸”回购完全没问题,我不需要任何工作树,我也完全不确定为什么我需要索引。

4

1 回答 1

3

它并不像你想的那么简单。您当前有两个存储库,每个存储库都有自己的历史记录。
每个提交都有一个明确定义的父级。

要获得单一的、按时间顺序正确的历史记录,您必须更改大量提交的父级。

一个简短的示例说明了这一点:

存储库“配置”:

A <- C <- E

存储库“src”

B <- D <- F

假设提交 B 发生在 A 之后,C 之后 B 等等,所以你想要这个结果:

A <- B' <- C' <- D' <- E' <- F'

要实现这一点,您必须更改 to 的父B'A。的父级C'必须从更改AB'等。

这不是微不足道的。但有可能。

假设配置存储库位于“/usr/git/config”,src 存储库位于“/usr/git/config/src”。

首先,我们必须准备“src”存储库以包含“src”子文件夹中的所有文件:

  1. CD 到“/usr/git/config/src”
  2. 执行这个怪物:

    git filter-branch --index-filter 'git ls-files -s | sed "s-\t\"*-&src/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
    

其余的现在将发生在“config”存储库中,因此 CD 到“/usr/git/config”。

  1. 将“src”存储库添加为远程:git remote add src /usr/git/config/src
  2. 获取“src”存储库的提交:git fetch src
  3. 将来自“src/master”的提交与本地“master”合并:git merge src/master master
  4. 找出两个存储库的初始提交:git rev-list --max-parents=0 --pretty HEAD
  5. 注意两者中较旧的提交哈希
  6. 执行完整存储库的变基以摆脱合并:git rebase -f <hash from step 5>
  7. 移除遥控器:git remote remove src
  8. 删除文件夹“/usr/git/config/src/src”和“/usr/git/config/src/.git”
  9. 更新 .gitignore 以不再忽略“src”文件夹。

请注意:
这假设您在两个存储库中都只有一个主分支。

哦,并且:在执行此操作之前进行备份。我只在一个小型测试存储库上对其进行了测试,每个存储库有两个提交......


如果你在 src 子文件夹中只有一个存储库,那就更简单了,只需执行以下命令:

  1. CD 到“/usr/git/config/src”
  2. 从上面执行怪物
  3. 将“/usr/git/config/src”重命名为“/usr/git/config/src_tmp”
  4. 将“/usr/git/config/src_tmp”的完整内容移动到“/usr/git/config”,包括“.git”存储库
  5. 删除现在为空的“/usr/git/config/src_tmp”
于 2013-02-14T13:42:56.143 回答