我有一个名为foo
的项目。在我的机器上,这个项目作为一个名为foo_container
的非git文件夹的子文件夹(即foo_container/foo
)。 foo
是一个git文件夹,我还将它同步到github,并进行了一些更改。
后来,我在foo_container(如foo_container\foo_docs
)下的其他文件夹中添加了更多内容,并希望从现在开始检查foo_container作为我的repo。我不想丢失foo
的git历史记录,但是,当然,从现在开始记录foo_container的更改是正常的。
最干净的方法是什么?以下是我考虑过的几个选项:
选项#1:
cd /path/to/foo_container
git init
<rename repository on github from foo to foo_container>
<some git-remote command - I don't know what this should be to switch existing repo>
选项#2(可能有效,但我怀疑我将丢失foo
目录的git历史记录)
删除github上的旧foo
个回购,在foo_container
和git init
中创建一个名为foo_container
,git-remote add origin <...foo_container.git>
的新回购邮件和{{1}}
我不确定这些方法中的任何一种是否有效,哪种方法更好。
答案 0 :(得分:2)
foo
中的所有内容移至名为foo
的子目录中(以便您将[{1}}作为实际项目)。承诺这一举动。 foo/foo
移至foo_container
,以便您拥有foo
之类的内容。添加并提交所有这些。 foo/foo_docs
设置为顶级foo
目录并删除旧目录。即在foo_container
时,请foo_container
,mv foo ../foo_container2
,cd ..
,rmdir foo_container
。 答案 1 :(得分:1)
怎么样......
cd foo_container/foo
mkdir foo
git mv * foo/
git commit -m "Move foo to subfolder"
这会让你感到结构......
foo_container/
foo/
.git/ (git repo data)
foo/ (actual contents you've been tracking)
bar/ (other thing you want to add)
然后,将当前位于foo_container/foo
的所有内容直接移至foo_container
(包括.git
目录),为您留下结构......
foo_container/
.git/ (git repo data)
foo/ (actual contents you were tracking)
bar/ (other thing you want to add)
现在foo_container
中所有不是foo
的内容将显示为要添加到git存储库的新文件,该存储库现在位于{{1} },foo_container
仍会显示为文件夹,由于foo
,您仍然会在旧提交中显示历史记录。
git mv
答案 2 :(得分:1)
第一种方法很好,因为你可以将foo声明为foo_container的子模块。
但最简单的是:
foo
重命名为foo_container
(所以foo_container/foo_container
)git mv foo_container/foo_container
的内容位于新文件夹&#39; foo
&#39; (foo_container/foo_container/foo
)foo_container\foo_docs
中复制foo_container/foo_container/foo_docs
:添加,提交并推送foo_container
foo_container/foo_container
。答案 3 :(得分:1)
您可以使用git filter-branch
重写历史记录来避免“然后一切都被移动”提交:
cd /path/to/foo_container/foo
git filter-branch --tree-filter 'mkdir foo; git mv -k * foo/ ' HEAD
cd /path/to/foo_container
mv foo/* foo/.git . # and any other hidden files, like .gitignore
git add foo_docs
现在您的目录如下:
foo_container
├── .git
└── foo
| └── stuff
└── foo_docs
└── other stuff
你的历史看起来总是如此。
注意:重写历史记录后,您必须将--force
添加到下一个git push
命令中。
注意:在你git push --force
之前,你应该检查git log
并确保没有任何灾难。
注意:正如Noufal Ibrahim在下面提到的那样,重写历史将会对任何拉过旧历史的人施加额外的工作。