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

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

Я пытался использовать 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

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


person prw56    schedule 09.01.2015    source источник


Ответы (2)


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

040000 tree aa8c07e1371022a183b011d5d41517ef54780a17    test_tree
person ThePyroEagle    schedule 11.01.2015
comment
Я не уверен, что неправильно вставил его сюда, но у меня было 4 пробела между sha и именем дерева (test_tree). Я дважды проверил и попробовал еще раз, я все еще получаю ту же ошибку. - person prw56; 13.01.2015
comment
Я знаю, как работает Git внутри, но я не знаю, что делает большинство команд git. Можно попробовать сделать это вручную, но это не так просто сделать. - person ThePyroEagle; 13.01.2015
comment
Прошу прощения, когда я проверял это до того, как предположил, что изначально использовал вкладку между хэшем и именем дерева, поэтому я подумал, что проблема не в этом, а оказалось, что это так. заменив 4 пробела между aa8c07e1371022a183b011d5d41517ef54780a17 и test_tree, которые у меня были, на вкладку исправил это. - person prw56; 14.01.2015

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

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

$ cat tree.txt
040000 tree 4d5fcadc293a348e88f777dc0920f11e7d71441c    foo

$ git mktree < tree.txt
0a7f38a609340d0b8eede2f6debf8bad4191738f

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

person Andrew Aylett    schedule 13.01.2015
comment
Наконец-то я заработал! Оказывается, проблема заключалась в том, что я использовал 4 пробела вместо табуляции между хешем и именем (мне нужно извиниться перед ThePyroEagle, так как он уже предложил это). Кроме того, если в файле есть завершающая новая строка, возникает странный артефакт, который возникает, когда я смотрю на дерево с помощью git cat-file -p ‹insertTreeHashHere›. Если бы я использовал mktree в файле с завершающей новой строкой, имя дерева было бы указано как: test_tree\r (с кавычками и /r), но если нет завершающей новой строки, это выглядело бы нормально: test_tree (без кавычек или /r) - person prw56; 14.01.2015
comment
Похоже, у вас есть новая строка Windows (\r\n), а не Unix (\n). Рад, что вы смогли это исправить, может быть, не только примете ответ, но и проголосуете? - person Andrew Aylett; 14.01.2015
comment
Как только у меня будет хотя бы 15 представителей, я намерен проголосовать за ваш ответ, а также за его. Также двойное спасибо, потому что ваш комментарий о том, что это новая строка Windows, был правильным, и вы помогли мне решить еще одну проблему. - person prw56; 15.01.2015
comment
Что ж, если это дерево существовало, то нет абсолютно никакого смысла снова добавлять его. Если он уже существует, скорее всего, содержимое точно такое же. - person ThePyroEagle; 19.01.2015
comment
@ThePyroEagle, дерево, о котором я спрашивал, было помещено в качестве поддерева нового дерева, а не само новое дерево. - person Andrew Aylett; 20.01.2015