Git: возможность создания определенного содержимого файла, не касаясь рабочего дерева. - PullRequest
3 голосов
/ 20 декабря 2011

Я хочу изменить индекс одного (текстового) файла без необходимости изменять состояние файла рабочего дерева. Возможно ли это?

Ответы [ 3 ]

1 голос
/ 21 декабря 2011

Да, вы можете явно поставить BLOB-объект по определенному пути с помощью git update-index.

git update-index --cacheinfo 100644 <sha1-of-blob> path/in/repo

Вам также нужно будет использовать --add, если путь представляет собой новый файл ветви.

Если файл, который вы хотите создать, - это большой двоичный объект, которого еще нет в репозитории git, тогда вы можете сохранить новый большой двоичный объект в репозитории git с помощью git hash-object, например ::

blobid=$(command_that_creates_output | git hash-object -w --stdin)

или

blobid=$(git hash-object -w /path/not/necessarily/in/repository)

Затем вы можете создать блоб, как указано выше.

git update-index --cacheinfo 100644 blobid path/in/repo
1 голос
/ 28 марта 2012

Еще один вариант «изменения файла в индексе без изменения рабочего каталога» - применить патч только к индексу. Это часто - способ, которым клиенты git GUI ставят только выбранные строки из данного файла.

Вы начинаете с (если хотите) очищения изменений индекса от этого файла:

git reset path/to/file

Затем извлекаем для него полный патч

git diff path/to/file > /path/to/tmpfile

Отредактируйте файл патча, включив в него только те изменения, которые вы хотите применить, и примените только отредактированный патч:

git apply --cached /path/to/tmpfile

См:

git help apply
1 голос
/ 20 декабря 2011

да, вы можете использовать опцию --work-tree на уровне git любой (на самом деле это не так. Она должна работать на любом, но есть крайние случаи):

git show HEAD:path/to/your/file.txt > /some/other/place/file.txt
# modify the file in /some/other/place/file.txt
git --work-tree=/some/other/place add /some/other/place/file.txt
...