我使用git rev-list --all --format="%H%n%B"
來檢索git存儲庫的所有(可達)提交。以機器可讀格式獲取git revlist的輸出
我需要能夠產生的輸出解析成單獨的字段爲提交散列以及所述生體。
- >是否有任何強大的方式來格式化輸出的方式,以便它可以被解析?
雖然提交散列的長度是固定的,但是原始文本的行數不確定,因此需要某種分隔符。我想過用xml的標籤包裝輸出,例如--format="<record>%H%n%B</record>"
,但是這具有明顯的缺點,即如果將字符串</record>
插入到原始體中,將會使解析器制動。當然,我可以使分隔符更加複雜,以減少將某人插入到提交消息中的風險,但我真正需要的是一個角色,在技術上不能成爲原始主體的一部分。我試圖使用ASCII控制字符作爲記錄分隔符「\ x1F」。但是,它並沒有像預期那樣插入輸出,而是照原樣打印。
基於從託雷克回覆(謝謝!)我是能夠創建一個小的Python函數:
from subprocess import Popen, PIPE
from codecs import decode
directory = '/path/to/git/repo'
git_rev_list = Popen(['git', '-C', directory, 'rev-list', '--all'], stdout=PIPE)
git_cat_file = Popen(['git', '-C', directory, 'cat-file', '--batch'],
stdin=git_rev_list.stdout, stdout=PIPE)
while True:
line = git_cat_file.stdout.readline()
try:
hash_, type_, bytes_ = map(decode, line.split())
except ValueError:
break
content = decode(git_cat_file.stdout.read(int(bytes_)))
if type_ == 'commit':
yield _get_commit(hash_, content)
git_cat_file.stdout.readline()
>」但我會保留它,因爲這意味着你可以告訴提交除了註釋標籤「 這真的是一個問題?我添加了一些帶註釋的標籤來提交,但它們不會在'git rev-list --all'中顯示出來。 –
默認情況下,no('git rev-list'只打印提交的散列ID,除非你給它'--objects',然後它會添加會混淆'git cat-file'的信息)。如果您要將'git cat-file'提供給'git rev-parse'的輸出,您可以獲取標籤,而在某些情況下您可能需要這樣做。 – torek