git - 如何恢复由于不正确的.gitattributes而损坏的PNG文件?
问题描述
我添加并提交了几个 PNG 文件并将其推送到我的 git 存储库中,但不幸的是,我有一个不正确的 .gitattributes 文件,如下所示:
* text
# no settings for PNG files
PNG文件被git视为文本文件。现在我无法再打开它们,而且我也丢失了它们的原始副本。有没有办法恢复它们?谢谢!
更新:.gitattributes
添加 PNG 文件时,它已经在 repo 中。这意味着我无法在提交历史记录中找到 PNG 文件的良好状态。所有的提交都是在 Windows 上进行的。
解决方案
让我们假设您有 2 次提交:
- 在第一个中,所有 PNG 文件都作为二进制文件处理,这些文件是健全的。
- 第二次提交包含
.gitattributes
文件并且所有 PNG 文件都被损坏,因为它们被视为文本文件。
这是git log
输出:
commit d075d282795362e03318d93c36406822facc015c (HEAD -> master)
Author: John Doe <john.doe@users.noreply.github.com>
Date: Tue Mar 26 17:12:16 2019 +0100
Bad state
Gitattributed file added, PNG files are treated as text, they are now corrupted
commit fcaa5a87eb816ddafbd256e83ea4be004a87a6e8
Author: John Doe <john.doe@users.noreply.github.com>
Date: Tue Mar 26 17:11:36 2019 +0100
Good state
PNG Files are treated as binary, they are not corrupted yet
首先将所有 PNG 文件重置为其初始状态:
git reset fcaa5a87eb816ddafbd256e83ea4be004a87a6e8 -- *.png
然后提交更改而不添加任何文件:
git commit -m 'Fix PNG files'
丢弃工作目录中的所有更改:
git checkout '*.png'
最后删除错误.gitattributes
的条目或将其替换为:
*.png binary
您还可以使用包含许多其他文件类型的gitattributes 模板。
更新:
如果没有“良好”状态(图像完好无损),您可以尝试通过操作文件来解决问题。您需要添加缺少的换行符。您不知道正确的位置,因为 git 已将它们全部删除。根据我的经验,如果您在第一行末尾添加一个回车符,它会修复大多数小的 PNG 文件。我不知道为什么,也无法保证,但您仍然可以尝试:
首先删除所有PNG文件:
rm -f *.png
然后将 PNG 文件声明为二进制文件.gitattributes
:
*.png binary
恢复文件:
git checkout '*.png'
在第一行末尾添加回车:
perl -i -p -e 's/$/$1\r/ if $. == 1;' *.png
推荐阅读
- javascript - LocalStorage 数据出现在控制台中但不在 DOM 中
- javascript - 为什么 dangerouslySetInnerHTML 属性返回 Uncaught Invariant Violation 错误?
- r - 在 R 中为选定的列名添加前缀
- node.js - 我正在努力为我的机器人添加一些迷你游戏,!coinflip 或!rps
- r - 分组和拆分列 dplyr
- javascript - Vue:在另一个页面上显示来自表单提交的响应
- node.js - 我的客户端不在 aws(amazon) Ec2 实例上工作
- swift - 如果标签是有条件的,NavigationLink 不起作用
- javascript - Laravel 路由器返回错误 500 internal-server-error
- node.js - 处理 NodeJS 控制器中的多个错误检查