【问题标题】:How to "read-only"-recover local GIT repository and file references after deleting .git folder?删除 .git 文件夹后如何“只读”-恢复本地 GIT 存储库和文件引用?
【发布时间】:2018-05-24 02:26:32
【问题描述】:

作为一种备份方式,我通过每隔一段时间提交新的更改将文件夹结构推送到 GIT 存储库。在这种情况下,它是我的 Linux 用户 $HOME 文件夹的大部分内容。由于备份还包括各种应用程序(例如邮件客户端、浏览器等)的本地文件夹,因此,即使在最近的 git-push 几秒钟后,自然也会有一大堆新的和未提交的更改。

碰巧,我不小心破坏了我的~/.git/ 文件夹(用另一个存储库中的~/.git/ 文件夹覆盖了它,所以它真的消失了)。我想通过从远程克隆 GIT 历史记录来恢复它,并保留所有文件与其存储库对应部分的连接,但不希望本地文件被 git-clone 或 git-pull 覆盖。我尝试按照this answer 恢复.git/ 文件夹,使用git fetch 然后git reset 版本。所有四个命令都没有错误地完成。但是,就我的本地存储库而言,我陷入了一种困境:

  • git branch -av 显示正确的远程主服务器,并在那里进行正确的最后一次提交 - 但;没有列出 本地 分支/主节点。

  • git status 显示:

    On branch master
    
    Initial commit
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
        [...]
    

    自上次提交后更改的本地文件和 git-push 未列出。

  • git log 显示:fatal: your current branch 'master' does not have any commits yet

  • 我尝试存储本地更改以便 git-pull 并重新应用存储;但是,git stash save 会导致:

    fatal: bad revision 'HEAD'
    fatal: bad revision 'HEAD'
    fatal: Needed a single revision
    You do not have the initial commit yet
    
  • git checkout master 中止:

    error: The following untracked working tree files would be overwritten by checkout:
        [...]
        [... looooong list of files and folders ...]
        [...]
    Please move or remove them before you can switch branches.
    Aborting
    
  • git rev-parse --abbrev-ref HEAD 结果为“HEAD”——如果一切正常,它应该输出一个分支名称或“master”(我使用此命令在 bash 的提示符中显示当前分支名称)。

有人可以为我指出一个有用的方向,即如何在不覆盖(未提交)更改的情况下“恢复”本地存储库和所有文件引用? answer from the other topic 中似乎缺少什么?

【问题讨论】:

  • 将存储库克隆到一个单独的文件夹,检查您要继续的分支,这将准备好包含所有正确引用的 .git 文件夹。然后将 .git 文件夹从这个单独的文件夹移到正确的位置,并且只有 .git 文件夹。如果您现在在真实文件夹中执行git status,您将获得状态,就好像您刚刚将所有文件更改为它们当前的状态,与存储库认为它们应该是什么相比。然后,您应该可以从上次中断的地方继续。
  • 谢谢 Lasse 和 VonC。是的,我考虑过这一点,但希望不必如此,因为我担心克隆时磁盘空间会用完。 :D

标签: linux git


【解决方案1】:

一个技巧是将您当前损坏的存储库(缺少 .git 的存储库)视为工作树(您修改的文件所在的位置)

将 repo 克隆到别处,然后将您的文件从第一个工作树添加到您的第二个克隆 repo:

cd /path/to/second/cloned/repo
git --work-tree=/path/to/first/repo add .
git commit -m "import work in progress"
git push

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2012-06-09
    • 2017-01-20
    • 2018-07-28
    相关资源
    最近更新 更多