不知何故,当我git init
编辑我的最新项目大约一个月前,我在目录中运行了一个高于项目根目录的命令。
所以我的存储库位于./project
目录而不是./project/my-new-project
目录中。我不知道我之前没有意识到这个问题,但直到现在我才开始寻找.git目录。
有没有办法在不杀死我的项目的情况下将存储库移动到正确的目录然后告诉git项目的新基础是什么?只是移动目录不起作用。 Git认为所有文件都已删除。
答案 0 :(得分:228)
我有相反的问题 - 必须将git root转移到父目录(从project / src到project) 令我极为惊讶的是,以下工作!!
src$ mv .git ../
src$ cd ..
project$ git add src
project$ git commit -a
git巧妙地检测到所有新文件都重命名为旧版本,并且没有丢失历史记录
您可以尝试类似的东西...移动.git文件夹并在提交之前再次添加文件
答案 1 :(得分:36)
这对我有用,并且保留了我的所有历史。从错误的根文件夹(您意外初始化回购的父级):
移动文件夹:
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%)
换句话说,所有来自父文件夹的引用都被重命名为使用正确的文件夹。
答案 2 :(得分:34)
git filter-branch
可让您以这种方式重写历史记录。 git filter-branch
man page甚至包含您的案例as an example:
要重写存储库,看起来好像是foodir /是它的项目根目录, 并丢弃所有其他历史记录:
git filter-branch --subdirectory-filter foodir -- --all
您可能希望在git clone
运行之前(或之后?)将repo git filter-branch
放入新的子目录中。 (在filter-branch之前克隆并在新克隆上运行filter-branch将具有将原始.git/
目录保留为备份的优点,以防出现问题。)
答案 3 :(得分:16)
除非您已经创建了一些要保存的历史记录,否则可能最简单的事情就是删除.git
子目录并在正确的目录中重做init。
如果您使用git来解决问题,那么任何解决方案都必然会留下很多“此处移动此文件”的历史条目,这些条目实际上并未发生变化,但您在创建时修复了一个错误。最好是正确创造它。
答案 4 :(得分:9)
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."
答案 5 :(得分:3)
使用git-mv
将文件“向上”移动到正确的位置,然后git-rm
“my-new-project”目录。
答案 6 :(得分:2)
我来到这里寻找一种方法将我的存储库移到任何地方。
如果我不是唯一一个,这就是我最后所做的:
https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F 我“git clone --mirror”d我的repo的副本,然后告诉它不再是裸机,所以文件出现在那个新文件夹中。 (然后检查文件和日志是否已经出现。)保留旧回购一段时间,以防万一......
这样我就可以在不丢失历史的情况下移动我的回购。
最好的问候, 黛娜
答案 7 :(得分:1)
刚刚遇到同样的问题,我的最终解决方案是:
git reset --hard HEAD
它像魔术一样对历史没有影响。 - N.B。如果你做了一些更改,请确保在移动.git目录之前提交它们。
答案 8 :(得分:-2)
这里有两种方式:
cd TheWrongDirectory rm -rf .git
- 醇>
只需删除.git文件夹并cd到正确的目录。