python - git ls-files 脚本如何工作

标签 python git

执行 git ls-files 的脚本怎么样? 是否可以修复索引文件或从损坏的索引文件中提取文件列表? 正则表达式可能吗?最好在 python 2.7.6 中

最佳答案

根据腐败程度,这可能可行也可能不可行。 Git 的数据结构和相关工具更适合检测损坏而不是修复损坏。

特别是,索引本身不是存储库的一部分,它是从当前内容派生的,所以在大多数情况下,您最好删除它并执行 git reset 重新创建它.阅读您的问题的任何人都可能想知道您的存储库是如何进入该状态的。

考虑到这一点,这里有一些想法:

索引的最后 20 个字节是截至该点的文件内容的 sha1。如果它们已损坏,您可以使用十六进制编辑器覆盖它们。

~$ python3
>>> data = open('.git/index', 'rb').read()
>>> data[-20:].hex()
'e211d8f60209ca8571c2acc73f9a24ef523b5fa3'
>>> hashlib.sha1(data[:-20]).hexdigest()
'e211d8f60209ca8571c2acc73f9a24ef523b5fa3'

这可能会修复由脑损伤工具引起的简单损坏。

如果你真的想从一个完全损坏的索引文件中恢复任何你能恢复的东西,你可能想要:

  1. 阅读index-format.txt在引用实现中。
  2. 查看 libgit2 中的 parse_index 例程.
  3. 查看索引文件导致的具体错误。
  4. 仔细修补该例程以继续处理错误数据而不会崩溃。

另一种方法是使用 strings实用程序,如果您只想查看文件名列表。您将丢失相关的二进制信息(并且一些二进制信息将包含可打印的 ASCII 垃圾)。

关于python - git ls-files 脚本如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42200512/

相关文章:

python - Pandas groupby 找出正确与错误的百分比

Ubuntu 18.04.1 LTS 上的 git 命令错误地静默 : git 2. 17.1

git - 我怎样才能 merge 两个git提交

macos - Git 别名参数完成在 Zsh 中不起作用

git - IntelliJ IDEA 如何在不使用 .gitignore 文件的情况下自动检测和忽略 Git 存储库中的目标目录?

python - Ceph radosgw - 存储桶策略 - 默认使所有对象公开读取

python - 比较两个数据库的任何差异

python - 从 python 运行 shell 命令的最佳方法

python - 将多个 numpy 数组合并为一个

git - 在 Windows 上为 Git 配置差异工具