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

Mik*_*ike 112 git

不知何故,当我git init在大约一个月前编辑我的最新项目时,我在目录中运行了一个高于项目根目录的目录.

所以我的存储库位于./project目录而不是./project/my-new-project目录中.我不知道我之前没有意识到这个问题,但直到现在我才从未找过.git目录.

有没有办法,没有杀死我的项目,将存储库移动到正确的目录,然后告诉git项目的新基础是什么?只是移动目录不起作用.Git认为所有文件都已删除.

Abh*_*and 240

我有相反的问题 - 不得不将git root转移到父目录(从project/src到project)令我极为惊讶,以下工作!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这对我很有用.我还从.gitigore这样的目录中移动了其他.git*配置文件 (8认同)
  • 亲爱的先生,你是一个生命救世主.这件事真的有用.谢谢. (7认同)
  • @Mike这应该标记为已接受的答案.这是重新启动的首选解决方案,因为您不会丢失历史记录.如果你不相信我,那么upvote计数就说明了一切. (7认同)
  • 谢谢!它对我有用,但我必须做更多的事情: 1. 在提交之前,我更新了 `.gitignore` 并在根文件夹中运行了 `git add -A`;在此之后,git 正确地将所有文件显示为“重命名”而不是“已删除”。2.由于我使用了子模块,我不得不将`.gitmodules`移动到新的根目录,并在各种git配置文件中更新子模块路径。为了找到要修改的文件,我运行了 `grep -nrI --color 'old/path/to/submodule' 。` (3认同)

hol*_*sal 39

这对我有用,并保持我的所有历史完好无损.从不正确的根文件夹(您意外初始化repo的父级):

移动文件夹:

mv .git thecorrectfolder/
Run Code Online (Sandbox Code Playgroud)

重新初始化git repo:

cd thecorrectfolder/
git init
Run Code Online (Sandbox Code Playgroud)

重新添加所有文件,提交和推送:

git add .
git commit -am 'fixing things'
git push origin master
Run Code Online (Sandbox Code Playgroud)

完成!给自己一杯啤酒吧.

当你在重新初始化之后提交git repo时,你会得到一堆看起来像这样的输出:

rename {ethanode/coffee => coffee}/app.coffee (100%)
Run Code Online (Sandbox Code Playgroud)

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

  • git init不是必需的,其余部分与我之前提交的答案相同:http://stackoverflow.com/a/3247756/391753 (6认同)

ndi*_*dim 35

git filter-branch让你以这种方式重写历史.该git filter-branch手册页甚至以您的案例为例:

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

git filter-branch --subdirectory-filter foodir -- --all
Run Code Online (Sandbox Code Playgroud)

您可能希望git clone将repo放入git filter-branch运行之前(或之后)的新子目录中.(在filter-branch之前进行克隆并在新克隆上运行filter-branch将具有将原始.git/目录保留为备份的优点,以防出现问题.)


T.E*_*.D. 18

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

如果您使用git来解决问题,那么任何解决方案都必然会留下很多"此处移动此文件"的历史条目,这些条目实际上并未发生变化,但您在创建时修复了一个错误.最好是正确创造它.

  • 这打破了很多东西.http://stackoverflow.com/a/3247756/825364是一个更好的方法. (8认同)
  • 下面的答案是一个更好的方法,因为它保留了所有的历史 (3认同)
  • 我看到你在说什么,但是你所做的任何改进行为都会导致一些"将这个文件移到这里"的历史记录实际上没有改变,但你在创建时修复了一个搞砸了.最好是正确创造它. (2认同)
  • 好吧,保存一些历史就是Git的用途.也许我们应该删除.git子目录并从我们的系统中卸载Git?毕竟使用ftp-server而不是vcs可能是最简单的事情! (2认同)
  • 所以对我来说,我做到了这一点并立即意识到我的错误.无需担心任何变化,这是回归清单的最简单方法. (2认同)

M. *_*loo 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."
Run Code Online (Sandbox Code Playgroud)