我的Git存储库位于错误的根目录中。我可以移动吗?(../ 代替 。/)


118

不知何故,当我git init一个月左右前完成我的最新项目时,我在比项目根目录高一个目录的目录中运行了该命令。

所以我的存储库在./project目录而不是./project/my-new-project目录中。我不知道我是如何早早意识到这个问题的,但是直到现在我才一直没有寻找.git目录。

有没有一种方法可以在不终止我的项目的情况下将存储库移至正确的目录,然后告诉git项目的新基础是什么?仅移动目录不起作用。Git认为所有文件都已删除。

Answers:


19

除非您已经创建了要保存的历史记录,否则最简单的事情可能就是删除.git子目录并在正确的目录中重做init。

如果您使用git来解决问题,那么任何解决方案都必然会留下很多“实际上没有更改”的历史记录条目,这些条目实际上并没有改变,但是您在创建时就修正了错误。最好只是正确地创建它。


2
我明白您在说什么,但是您为纠正此问题所做的任何in-git动作最终都会留下一堆实际上没有改变的“在此处移动此文件”历史记录,但是您在创建时修正了错误。最好只是正确地创建它。
TED

8
这打破了很多东西。stackoverflow.com/a/3247756/825364是一种更好的方法。
史蒂夫·陶伯

2
好吧,保存一些历史记录就是Git的目的。也许我们应该删除.git子目录并从系统中卸载Git?毕竟,使用ftp服务器而不是vcs可能是最简单的事情!
Gherman

2
下面的答案是一种更好的方法,因为它保留了所有历史记录
BigMikeW

2
所以对我来说,我做到了,立即意识到了我的错误。无需担心任何更改,这是回到干净状态的最简单方法。
迈克,

261

我遇到了相反的问题-必须将git根目录移到父目录(从project / src到project),令我惊讶的是,以下方法有效!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

git巧妙地检测到所有新文件都被重命名为旧文件,并且没有丢失任何历史记录

您可以尝试类似的操作...移动.git文件夹并在提交之前再次添加文件


8
这对我来说非常有效。我还从目录中移动了其他.git *配置文件,例如.gitigore
Relequestual 2012年

7
亲爱的先生,您是救生员。这东西确实有效。谢谢。
Radu Murzea

1
另外,我git rm'd是从旧位置来的文件,因此git status(正确地)最终报告了许多重命名操作。我与git的合作越多,我就越喜欢它。
ssc

7
@Mike,应将其标记为已接受的答案。这是重新初始化的首选解决方案,因为您不会丢失历史记录。如果您不相信我,支持投票将说明一切。
约瑟夫·斯彭斯

3
谢谢!它对我有用,但是我还要做两件事:1.提交之前,我更新.gitignoregit add -A在根文件夹中运行;之后,git正确显示所有文件为renamed而不是deleted。2.由于我使用子模块,因此我必须移至.gitmodules新的根目录,并更新各种git配置文件中的子模块路径。要查找要修改的文件,我运行了grep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari

43

这为我工作,并保持了我所有的历史。从错误的根文件夹(您不小心初始化了存储库的父文件夹)中:

移动文件夹:

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%)

换句话说,所有来自父文件夹的引用都被重命名以使用正确的文件夹。


谢谢!这种方法正是我所需要的!
Giel Berkers,2014年

这对我有用,但是有点难看。就git而言,我没有“移动”任何东西,我只是删除了数百个文件,然后添加了数百个其他相同的文件。
bjmc 2014年

6
git init不是必需的,其余部分与我的答案相同,而我的答案早于您的提交:stackoverflow.com/a/3247756/391753
Abhishek Anand 2014年

35

git filter-branch让您以这种方式重写历史记录。该git filter-branch手册页甚至有你的情况作为例子

要重写存储库,使其看起来好像foodir /已经是其项目根,并丢弃所有其他历史记录:

git filter-branch --subdirectory-filter foodir -- --all

您可能想git clonegit filter-branch运行之前(或之后)将存储库存储到新的子目录中。(在筛选器分支之前进行克隆并在新克隆上运行筛选器分支的优势在于,可以将原始.git/目录保留为备份,以防万一出问题。)


1
这不会“丢弃所有其他历史记录 ”(建议将存储.git库保留在顶层,而将子目录变为“被认为是根目录”)-这实际上将丢弃存储库中的所有其他文件,并将所有subdirectory/*文件移至根文件夹。
Louis Maddox

好的答案,但是请记住,如果存在.gitignore文件(如果已跟踪),则此操作将丢失该文件。此外,git push --force此后您还需要做一个更新上游存储库。
waldyrious

12

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."

3

使用git-mv移动文件“上升”到适当的位置,然后git-rm在“我的新项目”目录中。


相反。我不想将我的所有文件都移到git所在的目录中(那里还有很多其他内容……这会很烦人),然后再将git上移。我想将存储库移至项目的根目录。
迈克

2

我来这里是为了寻找一种方法来将我的存储库移动到任何地方

万一我不是唯一的一个,这就是我最后所做的:

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
cueedee

2

刚遇到同样的问题,我最终的解决方案是:

  1. 将.git文件夹移动到需要的位置。
  2. 将目录更改为我刚刚将.git移至的文件夹
  3. 将文件夹内容重置为git认为应该的样子: git reset --hard HEAD
  4. 使用kdiff3或其他比较工具检查内容是否符合要求
  5. 在旧位置删除现在未版本控制的文件。

它像魔术一样起作用,对历史没有影响。- 注意:如果进行了某些更改,请确保在移动.git目录之前将其提交。


-3

这里有两种方法:

  1. cd TheWrongDirectory rm -rf .git

  2. 只需删除.git文件夹并cd到正确的目录即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.