Answers:
除非您已经创建了要保存的历史记录,否则最简单的事情可能就是删除.git子目录并在正确的目录中重做init。
如果您使用git来解决问题,那么任何解决方案都必然会留下很多“实际上没有更改”的历史记录条目,这些条目实际上并没有改变,但是您在创建时就修正了错误。最好只是正确地创建它。
我遇到了相反的问题-必须将git根目录移到父目录(从project / src到project),令我惊讶的是,以下方法有效!
src$ mv .git ../
src$ cd ..
project$ git add src
project$ git commit -a
git巧妙地检测到所有新文件都被重命名为旧文件,并且没有丢失任何历史记录
您可以尝试类似的操作...移动.git文件夹并在提交之前再次添加文件
git rm'd是从旧位置来的文件,因此git status(正确地)最终报告了许多重命名操作。我与git的合作越多,我就越喜欢它。
.gitignore并git add -A在根文件夹中运行;之后,git正确显示所有文件为renamed而不是deleted。2.由于我使用子模块,因此我必须移至.gitmodules新的根目录,并更新各种git配置文件中的子模块路径。要查找要修改的文件,我运行了grep -nrI --color 'old/path/to/submodule' .
这为我工作,并保持了我所有的历史。从错误的根文件夹(您不小心初始化了存储库的父文件夹)中:
移动文件夹:
mv .git thecorrectfolder/
重新初始化git repo:
cd thecorrectfolder/
git init
重新添加所有文件,提交并推送:
git add .
git commit -am 'fixing things'
git push origin master
做完了!给自己喝杯啤酒。
重新初始化后提交git repo时,将获得一堆如下所示的输出:
rename {ethanode/coffee => coffee}/app.coffee (100%)
换句话说,所有来自父文件夹的引用都被重命名以使用正确的文件夹。
git filter-branch让您以这种方式重写历史记录。该git filter-branch手册页甚至有你的情况作为例子:
要重写存储库,使其看起来好像foodir /已经是其项目根,并丢弃所有其他历史记录:
git filter-branch --subdirectory-filter foodir -- --all
您可能想git clone在git filter-branch运行之前(或之后)将存储库存储到新的子目录中。(在筛选器分支之前进行克隆并在新克隆上运行筛选器分支的优势在于,可以将原始.git/目录保留为备份,以防万一出问题。)
.git库保留在顶层,而将子目录变为“被认为是根目录”)-这实际上将丢弃存储库中的所有其他文件,并将所有subdirectory/*文件移至根文件夹。
git push --force此后您还需要做一个更新上游存储库。
Git可以记住带有哈希值的文件,
只需将您.git移至根目录,并告诉git您记住所有带有--all选项的文件更改。
$ mv .git ../
$ cd ..
$ git add . --all
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."
我来这里是为了寻找一种方法来将我的存储库移动到任何地方。
万一我不是唯一的一个,这就是我最后所做的:
https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F 我“ git clone --mirror”是我的仓库的裸露副本,然后告诉它不再是裸露的,所以文件显示出来了在该新文件夹中。(然后检查文件和日志是否已出现。)将旧存储库保留一段时间,以防万一。
这样,我可以移动我的仓库,而不会丢失历史记录。
最好的问候黛娜
mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo。