【问题标题】:My Git repository is in the wrong root directory. Can I move it? (../ instead of ./)我的 Git 存储库位于错误的根目录中。我可以移动它吗? (../ 代替 。/)
【发布时间】:2009-12-16 22:03:16
【问题描述】:

不知何故,当我大约一个月前git inited 我的最新项目时,我在比项目根目录高一个目录的目录中运行了命令。

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

有没有办法在不杀死我的项目的情况下将存储库移动到正确的目录,然后告诉 git 项目的新基础是什么?只是移动目录是行不通的。 Git 认为所有文件都已被删除。

【问题讨论】:

    标签: git


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这对我来说非常有效。我还从 .gitigore 等目录中移动了其他 .git* 配置文件
    • 亲爱的先生,您是生命的救星。这东西真的很管用。谢谢。
    • 另外,我 git rm'd 来自旧位置的文件,所以 git status(正确地)最终报告了一些重命名操作。使用 git 的次数越多,我就越喜欢它。
    • @Mike 这应该被标记为接受的答案。这是重新启动的首选解决方案,因为您不会丢失历史记录。如果您不相信我,点赞数不言而喻。
    • 谢谢!它对我有用,但我还需要做几件事: 1. 在提交之前,我更新了 .gitignore 并在根文件夹中运行 git add -A;在此之后,git 正确地将所有文件显示为renamed 而不是deleted。 2.由于我使用子模块,我不得不将.gitmodules移动到新的根目录下,并更新各个git配置文件中的子模块路径。为了找到要修改的文件,我运行了grep -nrI --color 'old/path/to/submodule' .
    【解决方案2】:

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

    移动文件夹:

    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 而言,我没有“移动”任何东西,我只是删除了数百个文件,然后添加了数百个其他相同的文件。
    • git init 不是必需的,其余部分与我在您之前几年提交的答案相同:stackoverflow.com/a/3247756/391753
    【解决方案3】:

    git filter-branch 让你以这种方式重写历史。 git filter-branch man page 甚至还有你的情况as an example

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

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

    您可能希望在git filter-branch 运行之前(或之后?)将回购git clone 放入一个新的子目录中。 (在 filter-branch 之前进行克隆并在新克隆上运行 filter-branch 的好处是可以将原始 .git/ 目录保留在适当的位置作为备份,以防出现问题。)

    【讨论】:

    • 这不会“丢弃所有其他 history”(建议.git repo 保持在顶层,而子目录变为“被认为是root") - 这将丢弃 repo 中的所有其他文件,并将所有 subdirectory/* 文件移动到根文件夹。
    • 很好的答案,但请记住,如果有 .gitignore 文件(如果被跟踪),则此操作将丢失。此外,您需要在此之后执行git push --force 来更新上游存储库。
    【解决方案4】:

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

    如果您使用 git 来解决问题,任何解决方案都必然会留下很多“将此文件移至此处”的历史条目,这些条目实际上并没有改变,但您在创建时修复了一个错误。最好只是正确地创建它。

    【讨论】:

    • 我明白你在说什么,但是你为纠正这个问题所做的任何 in-git 操作最终都会留下一堆“将这个文件移到这里”的历史,这些历史实际上并没有改变,但你正在修复在创建时搞砸了。最好只是正确地创建它。
    • 这会破坏很多东西。 stackoverflow.com/a/3247756/825364 是一种更好的方法。
    • 嗯,保存一些历史记录是 Git 的用途。也许我们应该删除 .git 子目录并从我们的系统中卸载 Git?毕竟使用 ftp-server 而不是 vcs 可能是最简单的事情!
    • 下面的答案是一个更好的方法,因为它保留了所有的历史
    • 所以对我来说,我这样做了,并立即意识到我的错误。无需担心任何更改,这是恢复原状的最简单方法。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      使用git-mv 将您的文件“向上”移动到正确的位置,然后使用git-rm“my-new-project”目录。

      【讨论】:

      • 情况正好相反。我不想将我所有的文件都移到 git 所在的目录中(那里还有很多其他的东西……这会很烦人),然后将 git 向上移动。我想将存储库移动到我项目的根目录。
      【解决方案7】:

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

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

      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 的一个裸副本,然后告诉它不再是裸副本,所以文件出现在那个新文件夹中。 (然后检查文件和日志是否已经出现。)保留旧的 repo 一段时间,以防万一......

      这样我就可以在不丢失历史记录的情况下移动我的存储库。

      最好的问候, 黛娜

      【讨论】:

      • 如果我错了,请纠正我,但您似乎可以通过仅使用裸文件系统工具(如 mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo)将存储库目录移动到指定位置来实现这一点。
      【解决方案8】:

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

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

      它就像魔术一样起作用,对历史没有影响。 - 注意如果您做了一些更改,请务必在移动 .git 目录之前提交它们。

      【讨论】:

        【解决方案9】:

        这里有两种方式:

        1. cd TheWrongDirectory rm -rf .git

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

        【讨论】:

          猜你喜欢
          • 2010-10-11
          • 1970-01-01
          • 2023-04-08
          • 2018-03-28
          • 2010-11-13
          • 2012-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多