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

标签 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”前缀,而不是将文件移动到我的本地存储库并创建提交在 push 之前。肯定还有其他方法吗?

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

欢迎任何想法!

干杯,何塞

最佳答案

感谢到目前为止的回复...让我在 Google 上以不同的方式表述了这个问题。

答案其实都写在man page里面了,你只需要读到最后就行了。

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

下面的代码片段几乎是从手册页 git help filter-branch 中逐字提取的,只是经过编辑以反射(reflect)我示例中的目录。它要求每次提交涉及文件的路径名,重写它们前缀为“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

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

干杯,谢谢!

关于git - 重写路径时将本地 git 存储库迁移到更大的远程存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4247041/

相关文章:

git - Coda2 和 Git : Git working, 但没有比较、推送或 pull

git - checkout 到另一个分支时,文件被删除为未暂存的更改

eclipse - 在远程站点而不是本地使用 GIT

android - 第二个 maven-repository 被忽略

repository - 在 Gradle 构建中配置多个上传存储库

java项目在windows 10上完美运行,但在centos 7上运行不佳

ios - Swift:类型 'ViewController' 不符合协议(protocol) 'UIPageViewControllerDataSource'

github - 创建公共(public) GitHub 存储库时,处理第 3 方库的最佳方法是什么?

github - 如何在 GitHub 上为组织固定存储库?

git - ohmyzsh 在我当前的 git 存储库中有一个额外的符号