【问题标题】:Git removed all changed in all tracked filesGit 删除了所有跟踪文件中的所有更改
【发布时间】:2021-02-15 21:54:13
【问题描述】:

我做到了:

git add --all # success
git status # saw all my changes in staged area
git commit -am wip # failed because of some hooks (it was expected behavior)
# fixed the issue which causes the hooks to fail

然后:

~ git add --all
fatal: Unable to create '/Users/stavalfi/projects/dancer/.git/index.lock': File exists.

Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.

然后:

rm /Users/stavalfi/projects/dancer/.git/index.lock
git add --all
git status

最后一个命令只显示了我添加的新文件。

我丢失了所有跟踪文件中的所有更改。

怎么办?

【问题讨论】:

  • 你确定他们丢失了吗?据我了解,您的第三个命令是提交修改,所以也许您在上次提交中的更改......
  • 万一他们迷路了,这个答案可能会有所帮助:stackoverflow.com/a/42861993/5935112
  • 这对您目前的情况没有帮助,但我建议避免 git commit -a。 (-m 选项很好,您应该避免使用 -a 选项。)
  • 这有点难以理解并且它往往会与一些预提交挂钩进行不良交互。在这种情况下,我会担心这就是您的文件被破坏的方式。这并不是你的错——很可能,编写预提交钩子的人不知道-a 选项以及它是如何工作的,并且他们将错误放入了你遇到的钩子中。但是您可以通过避免选项来避免错误!
  • 看起来赫斯基本身只是一个框架。它包括一个例子/¿默认?运行 npm test 的预提交,我认为 应该 是安全的,但我不是 npm 专家。但它也允许你添加更多的钩子,每个钩子的每个作者都需要了解 Git 规则,所以一些第三方插件可能是这里的罪魁祸首。

标签: git


【解决方案1】:

当然不应该有。通过运行git add --all,您要求 git:

不仅在工作树有一个匹配<pathspec> 的文件的地方更新索引,而且在索引已经有一个条目的地方更新索引。这会添加、修改和删除索引条目以匹配工作树。

除非作为checkout 命令的一部分运行的钩子对工作目录做了某些事情,否则运行两个git add --alls 之间的索引状态应该是相同的。生成的 commits 应该会生成相同的树。

但如果发生了什么确实,那么你很幸运。 git add 将文件作为“blob”添加到对象数据库中。由于您没有提交该数据,因此它被视为垃圾,最终将被垃圾收集。但在那之前,你可以恢复它。

找到这些的最简单方法是使用专用工具git-recover,它可以为您找到这些未引用的 blob。

【讨论】:

  • 我已经尝试过 git-recover。没用,或者我用错了。你能给出确切的命令来帮助我吗?
猜你喜欢
  • 2011-03-30
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2015-12-25
相关资源
最近更新 更多