2015-01-09 2 views
2

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

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

Я попытался с помощью git mktree (как это показано на this page) так: cat ../info.txt | git mktree

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

040000 tree aa8c07e1371022a183b011d5d41517ef54780a17 test_tree 

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

fatal: input format error: 040000 tree aa8c07e1371022a183b011d5d41517ef54780a17 tree_name 

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

ответ

1

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

040000 tree aa8c07e1371022a183b011d5d41517ef54780a17 test_tree 
+0

Я не уверен, что я вставил его здесь неправильно, но у меня было 4 пробела между ша и именем дерева (test_tree). Я дважды проверил и попробовал еще раз, у меня все еще такая же ошибка. – prw56

+0

Я знаю, как Git работает внутри, но я не знаю, что делают большинство команд git. Вы можете попробовать сделать это вручную, но это не так просто сделать. – ThePyroEagle

+0

Прошу прощения, когда я проверил это, прежде чем я предположил, что изначально я использовал вкладку между хэшем и именем дерева, поэтому я подумал, что это не проблема, оказывается. заменив 4 пробела между aa8c07e1371022a183b011d5d41517ef54780a17 и test_tree, которые у меня были с вкладкой, зафиксированной им. – prw56

0

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

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

$ cat tree.txt 
040000 tree 4d5fcadc293a348e88f777dc0920f11e7d71441c foo 

$ git mktree < tree.txt 
0a7f38a609340d0b8eede2f6debf8bad4191738f 

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

+0

Я, наконец, получил его на работу! Оказывается, проблема заключалась в том, что я использовал 4 пробела вместо закладки между хешем и именем (мне нужно извиниться перед ThePyroEagle, поскольку он уже предложил это). Также, если в файле есть завершающая новая строка, возникает нечетный артефакт, который возникает, когда я смотрю на дерево, используя «git cat-file -p ». Если я использовал mktree для файла с конечной новой строкой, имя дерева будет указано как «test_tree \ r» (с котировками и a/r), но если нет конечной новой строки, это выглядит нормально: test_tree (без котировок или/r) – prw56

+0

Похоже, что у вас есть новая строка Windows ('\ r \ n'), а не Unix (' \ n'). Рад, что вы это исправите, возможно, отдадите предпочтение, а также ответ? –

+0

Как только у меня есть как минимум 15 человек, я намерен продвигать ваш ответ так же хорошо, как и его. Также благодарю вас за то, что ваш комментарий о том, что это новая строка Windows, верен, и вы помогли мне исправить еще одну проблему. – prw56