2010-11-22 135 views
5

我一直在我的计算机上为项目“MyProject”愉快地使用git。 MyProject实际上是一个更大的合作研究工作“WholeThing”的一部分。 myProject和WholeThing中的其他项目之间几乎没有重叠。将本地git存储库迁移到更大的远程存储库,同时重写路径

现在,大老板决定把所有的开发放到一个中央的git仓库(用于文档和备份)。目前为止对我有意义。

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

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

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


remote repo: 
WholeThing -| 
      |- .git 
      | 
      |- Area1 
      | 
      |- Area2 
       |------ MyProject 
       |------ DudesProject 

如何获取我的本地库到在中央存储库中的适当的子目录,同时保留历史和分支机构?

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

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

欢迎任何想法!

干杯,何塞

回答

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 

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

干杯&谢谢!

0

理想情况下,你应该在Wholething /区域2你自己的子项目MyProject.git。

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

做东西的正确方法是每个项目都有一个git树,所以在WholeThing下没有.git。使用正确的方法当您添加远程分支时,“WholeThing/Area2”会自动显示在URL中。

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 

,你应该是好去