Использование git read-tree без рабочего дерева

Я пытаюсь создать историю коммитов, используя команды git plumbing с голым репо. Я могу создать коммиты с одним безымянным объектом дерева, содержащим BLOB-объекты, но я не могу понять, как заставить этот безымянный объект дерева содержать другие объекты дерева.

Я пытался с помощью git read-tree --prefix=tree_name tree_shaи это говорит мне: fatal: This operation must be run in a work tree

Я пытался с помощью git mktree (как показано на этой странице), например: cat ../info.txt | git mktree

info.txt - это файл, содержащий 1 строку:

040000 tree aa8c07e1371022a183b011d5d41517ef54780a17    test_tree

и это говорит мне:

fatal: input format error: 040000 tree aa8c07e1371022a183b011d5d41517ef54780a17    tree_name

Может кто-нибудь сказать мне, как создать и назвать деревья?

2 ответа

Решение

Вам нужно четыре пробела вместо одного между хешем и test_tree. Если это все еще не работает, попробуйте вкладку.

040000 tree aa8c07e1371022a183b011d5d41517ef54780a17    test_tree

Я предполагаю дерево с хешем aa8c07e1371022a183b011d5d41517ef54780a17 уже существует в вашем репо? Если не, git mktree не удастся. Кроме того, у вас есть завершающий символ новой строки в info.txt? Мое чтение документов предполагает, что это также необходимо.

Я успешно использовал git mktree как это:

$ cat tree.txt
040000 tree 4d5fcadc293a348e88f777dc0920f11e7d71441c    foo

$ git mktree < tree.txt
0a7f38a609340d0b8eede2f6debf8bad4191738f

Где первые два пробела - пробелы, а третий - табуляция и завершающий перевод строки. Если сомневаешься, беги git ls-tree и проверить его вывод, возможно, с xxd,

Другие вопросы по тегам