【问题标题】:Recover files that were added to git, not committed and then accidentally deleted by git reset --hard恢复添加到 git、未提交然后被 git reset --hard 意外删除的文件
【发布时间】:2017-06-04 01:44:07
【问题描述】:

我有一个大问题。昨天误会开发和生产终端并排打开跑了

git add .

关于生产。这导致在公共/上传路径中暂存所有文件。当我尝试时

git status

它显示公共/上传中的所有文件都已暂存并准备好提交。但我从未提交过这些更改,因为在生产中我不想要任何提交或推送。生产环境的 SSH 密钥无权推送,只能克隆/拉取。

所以我运行了这些命令来强制从远程存储库中提取我的新代码

git fetch --all
git reset --hard  origin/master
git pull origin master

但现在我发现它已经删除了 public/uploads 路径中的所有文件以及它自己的目录。当我检查时

git status

我看到“您的分支与 'origin/master' 是最新的”。有没有办法从已删除的目录中恢复文件?这些文件非常重要...

【问题讨论】:

标签: git


【解决方案1】:

据我了解,git add 甚至在提交之前就将其参数文件注册到存储库中。如果它们没有被提交,那么它们将在以后被垃圾收集。因此,如果您及时采取行动,应该有一种方法可以从存储库中恢复文件。

尝试在存储库目录的根目录中运行以下 bash 脚本。它将创建一个新的子目录recovering_lost_files,其中包含比您的 HEAD 提交更新的 git 对象(因此对应于 git add-ed 但未提交的文件)。很遗憾,文件名不会自动恢复。

recover_lost_files

#!/usr/bin/env bash

headcommit="$(git log --format=format:%H)"
headcommitobject=".git/objects/${headcommit:0:2}/${headcommit:2}"
mkdir recovering_lost_files
find .git/objects/ -type f -newer "$headcommitobject"|while read -r path
do
    obj="${path#.git/objects/}"
    obj="${obj/\/}"
    git cat-file -p $obj > recovering_lost_files/$obj
done

【讨论】:

  • 谢谢!这似乎有效,recovering_lost_files 中出现了一些文件。
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2019-08-26
  • 2013-01-17
  • 2018-11-02
  • 2018-09-21
相关资源
最近更新 更多