我很高兴在我的机器上使用 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/