Spec-Zone.ru › Git

git-checkout-index

Имя

git-checkout-index - Копирование файлов из индекса в рабочую директорию

Синтаксис

git checkout-index [-u] [-q] [-a] [-f] [-n] [--prefix=<string>]
                   [--stage=<number>|all]
                   [--temp]
                   [--ignore-skip-worktree-bits]
                   [-z] [--stdin]
                   [--] [<file>…​]

Описание

Копирует все перечисленные файлы из индекса в рабочую директорию (без перезаписи существующих файлов).

Параметры

-u
--index

обновление информации о состоянии для проверенных записей в файле индекса.

-q
--quiet

не выводить сообщения, если файлы существуют или отсутствуют в индексе

-f
--force

принудительная перезапись существующих файлов

-a
--all

выводит все файлы из индекса, за исключением тех, для которых установлен бит skip-worktree (см. --ignore-skip-worktree-bits). Не может использоваться вместе с явными именами файлов.

-n
--no-create

Не создавать новые файлы, только обновлять уже проверенные.

--prefix=<string>

При создании файлов добавляет префикс <string> (обычно директория, включая конечный '/')

--stage=<number>|all

Вместо проверки неслитых записей, копирует файлы из указанной стадии. <number> должно быть от 1 до 3. Примечание: --stage=all автоматически подразумевает --temp.

--temp

Вместо копирования файлов в рабочую директорию, записывает содержимое в временные файлы. Ассоциации временных имен будут записаны в стандартный вывод.

--ignore-skip-worktree-bits

Выводит все файлы, включая те, для которых установлен бит skip-worktree.

--stdin

Вместо получения списка путей из командной строки, считывает список путей из стандартного ввода. Пути разделены символом LF (т.е. один путь на строку) по умолчанию.

-z

Значимо только с --stdin; пути разделяются символом NUL вместо LF.

--

Больше аргументов не интерпретируются как параметры.

Порядок использования флагов раньше имел значение, но сейчас нет.

Просто выполнение git checkout-index ничего не делает. Вы, вероятно, имели в виду git checkout-index -a. А если вы хотите принудительно заменить, то git checkout-index -f -a.

Интуитивность здесь не цель. Повторяемость - да. Причина поведения "без аргументов - без работы" заключается в том, что из скриптов вы можете сделать:

$ find . -name '*.h' -print0 | xargs -0 git checkout-index -f --

что заменит все существующие *.h файлы их кэшированными копиями. Если бы пустая командная строка подразумевала "все", это принудительно обновило бы всё в индексе, что не было целью. Но поскольку git checkout-index принимает --stdin, было бы быстрее использовать:

$ find . -name '*.h' -print0 | git checkout-index -f -z --stdin

-- — это просто хорошая идея, когда вы знаете, что остальное будут имена файлов; это предотвратит проблемы с именем файла, например, -a. Использование -- — это, вероятно, хорошая политика в скриптах.

Использование --temp или --stage=all

Когда используется --temp (или подразумевается --stage=all) git checkout-index создаст временный файл для каждого элемента индекса, который будет проверяться. Индекс не будет обновляться с информацией о состоянии. Эти параметры могут быть полезны, если вызывающей стороне нужны все стадии всех неслитых записей, чтобы обрабатывать неслитые файлы с помощью внешнего инструмента слияния.

В стандартный вывод будет записан список ассоциаций имен временных файлов с именами отслеживаемых путей. Формат списка имеет две разновидности:

  1. tempname TAB path RS

    Первый формат используется, когда --stage опущено или не --stage=all. Поле tempname — имя временного файла, содержащего содержимое файла, а path — имя отслеживаемого пути в индексе. Выводятся только запрошенные записи.

  2. stage1temp SP stage2temp SP stage3tmp TAB path RS

    Второй формат используется, когда --stage=all. Три поля временных файлов (stage1temp, stage2temp, stage3temp) перечисляют имя временного файла, если в индексе есть запись стадии, или . если записи стадии нет. Пути, имеющие только запись стадии 0, всегда будут исключены из вывода.

В обоих форматах RS (разделитель записей) по умолчанию — перевод строки, но будет нулевым байтом, если -z был передан в командной строке. Имена временных файлов всегда являются безопасными строками; они никогда не будут содержать символы разделителей каталогов или пробелы. Поле path всегда относительно текущей директории, а имена временных файлов всегда относительно верхнего уровня каталога.

Если копируемый объект в временный файл — символическая ссылка, содержимое ссылки будет записано в обычный файл. От конечного пользователя или интерфейса ПО зависит, будет ли эта информация использоваться.

Примеры

Для обновления и обновления только файлов, которые уже проверены
$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
Использование git checkout-index для "экспорта всей ветви"

Функциональность префикса в основном делает тривиальным использование git checkout-index в качестве функции "экспорта как дерева". Просто прочитайте нужное дерево в индекс и сделайте:

$ git checkout-index --prefix=git-export-dir/ -a

git checkout-index будет "экспортировать" индекс в указанную директорию.

Конечный "/" важен. Экспортируемое имя буквально просто добавляется в качестве префикса к указанной строке. Сравните это с следующим примером.

Экспорт файлов с префиксом
$ git checkout-index --prefix=.merged- Makefile

Это выведет текущую кэшированную копию Makefile в файл .merged-Makefile.

checkout-index

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-checkout-index

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API