如何将github)存储库切换到一级?

时间:2014-12-02 06:43:18

标签: git github

我有一个名为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_containergit init中创建一个名为foo_containergit-remote add origin <...foo_container.git>的新回购邮件和{{1}}

我不确定这些方法中的任何一种是否有效,哪种方法更好。

4 个答案:

答案 0 :(得分:2)

  1. foo中的所有内容移至名为foo的子目录中(以便您将[{1}}作为实际项目)。承诺这一举动。
  2. 将所有内容从foo/foo移至foo_container,以便您拥有foo之类的内容。添加并提交所有这些。
  3. foo/foo_docs设置为顶级foo目录并删除旧目录。即在foo_container时,请foo_containermv foo ../foo_container2cd ..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:添加,提交并推送
  • 将GitHub foo repo重命名为foo_container
  • 将本地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在下面提到的那样,重写历史将会对任何拉过旧历史的人施加额外的工作。