Русский ▾ Topics ▾ Latest version ▾ git-checkout-index last updated in 2.43.0

НАЗВАНИЕ

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

ОБЗОР

git checkout-index [-u] [-q] [-a] [-f] [-n] [--prefix=<строка>]
		   [--stage=<число>|all]
		   [--temp]
		   [--ignore-skip-worktree-bits]
		   [-z] [--stdin]
		   [--] [<файл>…​]

ОПИСАНИЕ

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

ПАРАМЕТРЫ

-u
--index

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

-q
--quiet

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

-f
--force

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

-a
--all

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

-n
--no-create

Не переключать новые файлы, только обновить уже переключённые файлы.

--prefix=<string>

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

--stage=<number>|all

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

--temp

Вместо копирования файлов в рабочий каталог записывает содержимое во временные файлы. Связи временных имён будут записаны в stdout.

--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 создаёт временный файл для каждой переключаемой записи индекса. Индекс не будет обновлён информацией stat. Эти параметры могут быть полезны, если вызывающей стороне нужны все стадии всех не слитых записей, чтобы не слитые файлы могли быть обработаны внешним инструментом слияния.

В stdout будет записан список, предоставляющий связь имён временных файлов с отслеживаемыми именами путей. Формат списка имеет два варианта:

  1. врем_имя TAB путь RS

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

  2. стадия1_время SP стадия2_время SP стадия3_время TAB путь RS

    Второй формат используется, когда указан --stage=all. Три временных поля стадии (стадия1_время, стадия2_время, стадия3_время) содержат имя временного файла, если в индексе есть запись стадии, или ., если записи стадии нет. Пути, у которых есть только запись стадии 0, всегда будут опущены в выводе.

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

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

ПРИМЕРЫ

Обновить и осветить только уже переключённые файлы
$ 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.

GIT

Является частью пакета git[1]