在重写路径时将本地git存储库迁移到更大的远程存储库

Jos*_*cia 5 git repository

我一直很乐意在我的机器上使用git作为项目"MyProject".MyProject实际上是更大的合作研究工作"WholeThing"的一部分.在WholeThing中,myProject和OtherProjects之间几乎没有重叠.

现在,Big Bosses决定将所有开发都放在一个中央git存储库(用于文档和备份).到目前为止对我有意义.

假设我没有访问中央存储库的特权.

问题是,MyProject映射到WholeThing的子目录,即

local repo:
MyProject -|
           |- .git
           |
           |- dirs


remote repo:
WholeThing -|
            |- .git
            |
            |- Area1
            |
            |- Area2
                 |------ MyProject
                 |------ DudesProject
Run Code Online (Sandbox Code Playgroud)

如何在保留历史记录和分支的同时将本地存储库放入中央存储库中的正确子目录中?

我(想想我;)了解远程分支和东西,但我还没有找到一种方法来为MyProject文件的路径添加前缀"WholeThing/Area2",而不是移动本地存储库中的文件并在推送之前创建提交.肯定还有另一种方式吗?

我也不介意克隆WholeThing并在完成所有迁移后导航到MyProject ...所以我不是在寻找子模块等(并且我没有对中央存储库的管理访问权限).

欢迎任何想法!

干杯,何塞

Jos*_*cia 3

感谢到目前为止的答复......让我在谷歌上以不同的方式提出这个问题。

答案实际上写在手册页中,您只需阅读到最后即可。

解决方案是重写历史记录并git filter-branch同时重写每个文件的路径。重写路径原则上可以使用--tree-filter(我认为)或使用 来完成--index-filter,后者要快得多。

下面的代码片段几乎是从手册页中逐字获取的git help filter-branch,只是进行了编辑以反映我的示例中的目录。它要求每次提交所涉及的文件的路径名,以“WholeThing/Area2/MyProject/”为前缀重写它们,并重播提交。

git filter-branch --index-filter \
    'git ls-files -s | sed "s-\t-&WholeThing/Area2/MyProject/-" |
     GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
     git update-index --index-info &&
     mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
Run Code Online (Sandbox Code Playgroud)

下一步(希望很简单)是添加远程存储库并推送到它。

干杯&谢谢!