Git checkout-index не работает для папок "не в кеше" - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь использовать git checkout-index для «экспорта» файлов из репозитория в другой каталог с исходным кодом, как описано в https://stackoverflow.com/a/160719/1068167

Мой репозиторий git имеет следующую структуру:

./src/subproject/[files]
./src/subproject/subfolder1/[files]
./src/subproject/subfolder2/[files]
./src/subproject2/[files]

Мой первый «экспорт», где я использовал флаг -a, работал отлично. Все мои файлы и папки были «экспортированы» в /tmp/export/src/..., как и ожидалось. Это команда, которую я использовал:

git checkout-index -a -f --prefix=/tmp/export/src/

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

Я думаю что-то вроде этого:

git checkout-index -f --prefix=/tmp/export/src/ -- ./src/subproject/*

Эта команда копирует файлы в папке 'subproject', но завершается неудачно с сообщением о вложенных папках.

git checkout-index: src / subproject / subfolder1 отсутствует в кэше

git checkout-index: src / subproject / subfolder2 отсутствует в кэше

Я надеялся, что будут скопированы следующие файлы и каталоги

/tmp/export/src/subproject/[files]
/tmp/export/src/subproject/subfolder1/[files]
/tmp/export/src/subproject/subfolder2/[files]

Как я могу экспортировать / оформить заданный указанный набор файлов и папок в моем подпроекте, чтобы копировать также все подпапки и их вложенные папки?

1 Ответ

1 голос
/ 04 ноября 2019

Чтобы git checkout-index скопировал файлы из индекса в другое альтернативное местоположение, используя --prefix=<string>, файлы должны быть в индекса. Ваши не.

Чтобы прочитать конкретный объект дерева Git в индекс, используйте git read-tree. Обратите внимание, что по умолчанию это уничтожает текущий индекс. Вы можете использовать вместо этого временный индекс;для этого экспортируйте имя безопасного, но в настоящее время несуществующего файла через имя переменной среды GIT_INDEX_FILE. Git создаст и использует этот файл в качестве индекса, пока переменная установлена. Сбросьте его (или используйте скрипт, который установил его выход) до, во время или после удаления временного файла для очистки.

Я не хочу экспортировать все файлытак как я удалил много файлов из других подпапок, которые не следует копировать.

Я подозреваю, что вы все делаете неправильно:

  • git checkout-index может копировать только те файлы, которые имеют в индексе.

  • Обычно вы заполняете индекс, считывая в него весь коммит,То есть, хотя git read-tree технически читает любой объект дерева, если вы указываете git read-tree на commit объект, он читает дерево для этого коммита.

  • Если вы удалили кучу файлов и зафиксировали, новый коммит будет коммитом, в котором нет (и никогда не было) удаленных файлов. Таким образом, чтение, которое фиксирует в индексе, а затем проверка индекса, не записывает этих файлов в целевой каталог из --prefix.

  • Но использование git checkout-index таким образом никогда не приведет к удалению файлов из целевого каталога. Если эти файлы уже существуют в цели, и вы не хотите, чтобы они существовали в цели, вам придется удалить их самостоятельно.

Следовательно, как правило, для использования git checkout-index для экспорта коммита требуется сначала заполнить индекс из коммита, а затем экспортировать в то, что будет создано как пустой каталог (--prefix=/tmp/emptied/ после rm -rf /tmp/emptied). Для этого гораздо проще использовать git archive. Это также избавляет от необходимости выполнять сложную работу с временным индексом, чтобы избежать разрушения индекса , если вы что-то с ним делаете, например, выполняете какую-либо реальную работу с рабочим деревом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...