index Git-разница между «предполагать-неизменным» и «skip-worktree»



git index что это (2)

У меня есть локальные изменения в файле, который я не хочу фиксировать в моем репозитории. Это файл конфигурации для создания приложения на сервере, но я хочу создать локально с различными настройками. Естественно, файл всегда появляется, когда я делаю «git status» как что-то, что нужно поставить. Я хотел бы скрыть это конкретное изменение и не совершить его. Я не буду делать никаких других изменений в файле.

После некоторого копания я вижу 2 варианта: «предполагать-неизменный» и «skip-worktree». Предыдущий вопрос here говорит о них, но на самом деле не объясняет их разногласий. Мой вопрос таков: как две команды разные? Почему кто-то использует тот или иной?

https://ffff65535.com


Вы хотите skip-worktree .

assume-unchanged предназначен для случаев, когда стоит проверить, была ли изменена группа файлов; когда вы устанавливаете бит, git (конечно) предполагает, что файлы, соответствующие этой части индекса, не были изменены в рабочей копии. Таким образом, это позволяет избежать беспорядка вызовов stat . Этот бит теряется всякий раз, когда изменяется запись файла в индексе (поэтому, когда файл изменяется вверх по течению).

skip-worktree - это нечто большее: даже если git знает, что файл был изменен (или должен быть изменен с помощью reset --hard или он будет притворяться, что он не был, используя версию из индекса вместо этого , Это сохраняется до тех пор, пока индекс не будет отброшен.

Существует хорошее резюме последствий этой разницы и типичных случаев использования здесь: http://fallengamer.livejournal.com/93321.html .

Из этой статьи:

  • --assume-unchanged предполагает, что разработчик не должен изменять файл. Этот флаг предназначен для повышения производительности для не изменяющихся папок, таких как SDK.
  • --skip-worktree полезен, когда вы даете указание git не касаться определенного файла, потому что разработчики должны его изменить. Например, если в главном репозитории вверх по потоку находятся некоторые готовые к конфигурации файлы конфигурации, и вы не хотите случайно вносить изменения в эти файлы, --skip-worktree - именно то, что вы хотите.

Примечание: fallengamer провел несколько тестов в 2011 году (поэтому они могут быть устаревшими), и вот его http://fallengamer.livejournal.com/93321.html :

операции

  • Файл изменяется как в локальном репозитории, так и в верхнем потоке
    git pull :
    В любом случае Git сохраняет локальные изменения.
    Таким образом, вы случайно не потеряете данные, отмеченные каким-либо из флагов.
    • Файл с флагом accept assume-unchanged : Git не будет перезаписывать локальный файл. Вместо этого он выводит конфликты и советы, как их разрешать
    • Файл с флагом skip-worktree : Git не перезаписывает локальный файл. Вместо этого он выводит конфликты и советы, как их разрешать

,

  • Файл изменяется как в локальном репозитории, так и в верхнем течении, пытаясь в любом случае
    git stash
    git pull
    Использование результатов skip-worktree приводит к некоторой дополнительной ручной работе, но по крайней мере вы не потеряете никаких данных, если у вас были локальные изменения.
    • Файл с флагом «Без assume-unchanged : отменяет все локальные изменения без возможности их восстановления. Эффект подобен « git reset --hard ». вызов « git pull » будет успешным
    • Файл с флагом skip-worktree : Stash не будет работать с файлами skip-worktree . « git pull » завершится с той же ошибкой, что и выше. Разработчик вынужден вручную сбросить флаг skip-worktree чтобы иметь возможность skip-worktree и завершить провал.

,

  • Никаких локальных изменений, файл с восходящим потоком не изменен
    git pull
    Оба флага не помешали бы вам получить восходящие изменения. Гит обнаруживает, что вы нарушили assume-unchanged обещание и намерены отразить реальность, сбросив флаг.
    • Файл с флагом «Без assume-unchanged : содержимое обновлено, флаг потерян.
      ' git ls-files -v ' покажет, что флаг изменен на H (от h ).
    • Файл с флагом skip-worktree : содержимое обновляется, флаг сохраняется.
      ' git ls-files -v ' будет показывать тот же флаг S что и до pull .

,

  • При изменении локального файла
    git reset --hard
    Git не затрагивает файл skip-worktree и отражает реальность (файл, обещанный без изменений, фактически был изменен) для файла assume-unchanged .
    • Файл с флагом «Без assume-unchanged : содержимое файла возвращается. Флаг сбрасывается на H (от h ).
    • Файл с флагом skip-worktree : содержимое файла не повреждено. Флаг остается тем же.

Он добавляет следующий анализ:

  • Похоже, что skip-worktree пытается очень сильно сохранить ваши локальные данные . Но это не мешает вам получать восходящие изменения, если это безопасно. Плюс git не сбрасывает флаг при pull .
    Но игнорирование команды « reset --hard » может стать неприятным сюрпризом для разработчика.

  • Assume-unchanged флаг Assume-unchanged может быть потерян при операции pull и локальные изменения внутри таких файлов, похоже, не важны для git.

Увидеть:

Он заключает:

На самом деле ни один из флагов достаточно интуитивно понятен .

  • Предполагается, что разработчик не должен изменять файл. Если файл был изменен - ​​это не важно. Этот флаг предназначен для повышения производительности для не изменяющихся папок, таких как SDK.
    Но если обещание сломано и файл фактически изменен, git возвращает флаг, чтобы отразить реальность. Наверное, вполне нормально иметь некоторые несогласованные флаги в папках, которые обычно не подлежат замене.

  • С другой стороны, skip-worktree полезна, когда вы даете указание git не касаться определенного файла. Это полезно для уже отслеживаемого конфигурационного файла.
    В главном репозитории Upstream есть готовая конфигурация, но вы хотите изменить некоторые настройки в конфигурации, чтобы иметь возможность провести локальное тестирование. И вы не хотите случайно проверять изменения в таком файле, чтобы повлиять на конфигурацию производства. В этом случае skip-worktree делает идеальную сцену.





git-index