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

时间:2010-11-22 15:31:44

标签: 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

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

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

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

欢迎任何想法!

干杯,何塞

3 个答案:

答案 0 :(得分:3)

感谢迄今为止的回复......让我在Google上以不同的方式提出问题。

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

解决方案是使用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

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

干杯&谢谢!

答案 1 :(得分:1)

是的,下一步很简单

git remote add other [path/to/repo]
git fetch other
git checkout -b other-master other/master
git checkout master
git merge other-master

你应该好好去

答案 2 :(得分:0)

理想情况下,您应该在Wholething / Area2下拥有自己的子项目MyProject.git。

如果你的老板想要为每个项目只有一个git存储库,这没有意义,但是如果他们仍然想要它,那就意味着WholeThing树是一个完全不同于你的新树,你可以除了拉动整个事物,添加你的目录并推送所有东西(以及DudesProject)之外什么都不做(你不能在git树的子集或子目录上工作)。无论如何,那将是2棵不同的树,你将失去所有的历史和东西。

正确的做法是每个项目都有一个git树,所以在WholeThing下没有.git。使用正确的方法,当您添加远程分支时,“WholeThing / Area2”在网址中自然出现。