Intereting Posts
что произошло с фиксацией, которая не отображается в каких-либо филиалах, но доступна в «git show», почему я вижу .gitignored файлы / папки, присутствующие внутри git repo? Плагин Git Parameter, показывающий список всех филиалов Git – восстановление удаленной папки из предыдущей фиксации Команда Git, вызываемая через phing, запрашивает учетные данные, даже если аутентификация с использованием открытого ключа для git-сервера установлена Каков наилучший способ протестировать приложение RailsApps в Gitlab CI? Проект Meteor, предоставляющий ошибку модуля npm при переключении ОС Можно ли включить папку .git Создание ветви git после внесения изменений в мастер Xcode 9 не может объединить ветку приложения SpriteKit Совместим ли git svn с поддеревом git? Запись уже существует – ошибка передачи SVN Хороший альтернативный источник управления для VS2005 и 2008 вместо VSS Проблема с настройкой псевдонима Git custom_hooks gitlab в post-receive, ssh на другой сервер

Что делает `git checkout-index -u` или` -index`?

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

Документация включает в себя загадочное замечание о --index командной строки -u или --index :

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

Что такое «информация о статистике»? В чем разница между его обновлением и не обновлением?

Я нахожу, что в простых экспериментах git checkout-index просто записывает файлы в рабочее дерево, как и следовало ожидать; Я не вижу никакой разницы между использованием -u / --index и не используя его.

git-checkout-index копирует данные из индекса в рабочее дерево. git-update-index копирует метаданные из рабочего дерева в индекс.

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

В частности, это обновляет (по крайней мере) метаданные, которые не вносят вклад в репозиторий git, а скорее используется для определения того, остались ли файлы неизменными. См. Как получить удобочитаемую дампу .git / index? и Что содержит индекс git ТОЧНО? ,

Добавлено в 415e96c .

В качестве примера я буду следовать вместе с t/t2002-checkout-cache-u.sh , который запускает команду сначала без, а затем с -u (опять же, это «эквивалент git update-index –refresh на выписке ").

1) подготовка:

 echo frotz >path0 && git update-index --add path0 && t=$(git write-tree) 

2) без -u, git checkout-index смазывает статистическую информацию.

 rm -f path0 && git read-tree $t && git checkout-index -f -a && git diff-files --exit-code 

вывод diff-файлов:

 :100644 100644 8e4020bb5a8d8c873b25de15933e75cc0fc275df 0000000000000000000000000000000000000000 M path0 --> 1 

посмотрите, что находится в индексе:

 $ git ls-files --debug path0 ctime: 0:0 mtime: 0:0 dev: 0 ino: 0 uid: 0 gid: 0 size: 0 flags: 0 

3) с -u, git checkout-index собирает информацию о статусе из новых файлов.

 rm -f path0 && git read-tree $t && git checkout-index -u -f -a && git diff-files --exit-code 

(возвращает 0)

теперь есть stat (2):

 $ git ls-files --debug path0 ctime: 1491479474:0 mtime: 1491479474:0 dev: 16777220 ino: 50556411 uid: 501 gid: 20 size: 6 flags: 0 

Помимо записанной информации о статусе, в выходе есть еще один интересный бит. Почему git-diff-files говорят о различиях между рабочим деревом и индексом?

В руководстве указано, что поле на выходе

sha1 для «dst»; 0 {40}, если вы создаете, не моргнули или смотрите дерево работы.

<sha1> отображается как все 0, если файл является новым в файловой системе, и он не синхронизирован с индексом.

Таким образом, этот тестовый пример иллюстрирует один способ использования git в метаданных: при сравнении файлов в рабочем дереве и индексе. Если информация о статусе выглядит устаревшей (или все нули), тогда файл может быть изменен. Поскольку git-read-tree только записывает в индекс, а не в рабочее дерево, это обязательно приводит к недействительности информации о статусе. И если информация о статусе действительна, git-diff-files могут с уверенностью предоставить идентификатор blob для этой записи.