将 .git 仓库移动到父级目录

46

我有一个名为“www”的子目录,它是一个代码仓库:

site
|-- www/
|    |-- .git/
|    |-- index.html
|-- design/
|    |-- images.jpg

我想把仓库更改为其父目录,使得仓库结构与原始文件结构相对应:

site
|-- .git/
|-- www/
|    |-- index.html
|-- design/
|    |-- images.jpg

这能做到吗?将更改推送到Gitlab会有什么影响吗?


2
我认为你可以将.git/目录向上移动一个或两个目录。这可能会有点费时,而且第一次提交会很有趣,但应该可以解决问题。(基于此问题的第二个答案https://dev59.com/zXI-5IYBdhLWcg3wTWj4) - mrcheshire
1
@mrcheshire 使用 git mv 命令时,会出现致命错误,提示目标目录“在仓库之外”。 - RGilkes
只需使用 mv 命令,然后执行 git add -Agit commit -a - maackle
1
@maackle 这将丢失所有的修订历史记录,看起来就像文件被删除了。 - RGilkes
@rholmes 不是的。www 目前是该代码库的根目录。 - RGilkes
显示剩余2条评论
2个回答

34
  1. 在你的代码库中创建一个名为www的文件夹。
  2. git mv将HTML文件移动到该目录中。可选择性地提交此步骤。
  3. mv设计目录到你的代码库中,并使用git add .添加文件。
  4. 提交更改。
  5. 重命名/移动整个代码库。

运行得非常完美。解决方案也非常简单! - RGilkes
通过在第二步中使用 git mv 命令,这将暂时(直到第五步完成)将您的文件移动到文件系统中的另一个位置,如果这些文件用于任何实时目的(例如作为 Web 服务器内容),则可能不可取。@user5241051 给出的解决方案没有这个缺陷。 - cueedee
2
仓库是用于开发的。几乎可以通过定义,工作树的内容将会不断变化。把它作为实时Web服务器内容使用是非常不明智的,至少可以这么说。 - Roland Smith
虽然这是非常正确的,但是git也被用于其他目的 - cueedee
对于那些进行了 Git 仓库移动的人,我有一个问题。如果我执行这些步骤,然后尝试重置到(或检出)在此移动之前发生的提交,会发生什么?会有任何问题吗?例如,Git 仓库是否会以某种方式返回到其原始目录? - cag8f
简洁优雅...谢谢! - Jc Nolan

21
以下指示将有效。
cd www
mv .git ../
git add www
git commit -a -m "Change root directory of project"
git add design/*
git commit -m "Start tracking design folder"

这将保留您的历史记录。


2
在执行此操作时,您将失去所有文件的历史记录。 - Youssef NAIT
1
@NAIT 如果我执行 git log 命令,历史记录会被保留,但在 GitHub 上历史记录则被删除了。 - viery365
这应该是被接受的答案。 - cueedee
话虽如此,还有一种方法可以重写历史记录,就好像父目录一直是仓库的一部分,可以在这里找到。不过,推送更改可能需要使用 --force - cueedee
你能解释一下这是如何工作的吗?它似乎有些违反直觉。通过这样做,我意识到git进行了重命名,但背后发生了什么? - Sahil Singh
1
在2个“cd ..”之后是否应该有额外的步骤,或者这是隐含的预期,因为并不是每个人都像我这样蠢... - Sjors Hijgenaar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接