2017-02-13 69 views
5

看起來好看的腳本是不是git ls-files? 有可能修復索引文件或從corupted索引文件中提取文件列表? 也許可能與正則表達式?最好在python 2.7.6如何工作git ls-files腳本

+1

你想找到你現有的'git-ls-files'二進制文件在哪裏?或者寫一個新的腳本來完成同樣的事情? _爲什麼_?這與你損壞的索引文件有什麼關係?哪個實際文件是 - '.git/index'?還有別的嗎? – Useless

+0

是的,我需要寫一個新的腳本,做的事情與git-ls-files完全一樣,因爲我只需要從.git/index文件中提取文件列表(無論它是否損壞),而不檢查錯誤簽名,散列和別的東西只是原始文件列表沒有垃圾 –

回答

3

根據腐敗的程度,這可能或可能不可行。 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垃圾)。

+0

字符串不是很糟糕,但也很多垃圾 –