Отменить git update-index --skip-worktree


148

Некоторое время назад я сделал это, чтобы игнорировать изменения в файле, отслеживаемом git:

git update-index --skip-worktree <file>

Теперь я на самом деле хочу зафиксировать изменения в этом файле для источника. Как мне отменить эффекты skip-worktree?


11
Мне также интересно, как получить список файлов в состоянии 'skip-worktree'?
Troex

Ответы:



35

Согласно http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html , используйте

git ls-files -v

чтобы увидеть файлы «предположим, что без изменений» и «пропустить рабочее дерево», помеченные специальной буквой. Файлы "skip-worktree" помечены S.

Редактировать : как упоминал @amacleod , создание псевдонима для перечисления всех скрытых файлов - хороший прием, чтобы вам не нужно было его запоминать. Я использую alias hidden="git ls-files -v | grep '^S'"в своем .bash_profile. Работает отлично!


9
Ухоженная. Я могу использовать git ls-files -v | grep '^S'для отображения только те файлы, которые я «спрятал» с помощью skip-worktree. Надеялся сделать псевдоним «скрытым» для этой команды, но перенаправление канала в псевдоним, похоже, не сработало.
amacleod

5
@amacleod использовать !. Как это [alias] ignored = !git ls-files -v | grep "^S"проверено, работает.
Стивен Лу

@amacleod Не думаете, что вы могли бы предложить альтернативную команду для Windows?
Стив Чэмберс

1
@ SteveChambers, если не считать установки grep, я не знаю. Зависит от вашей оболочки, я думаю. Git Bash действительно идет с grep, я думаю.
Amacleod

1
Великолепно, спасибо @amacleod - просто не было на моем пути. Единственное, что мне нужно было изменить, чтобы это работало в Windows, - это стиль цитат - 'не работал, но "работал, то естьgit ls-files -v | grep "^S"
Стив Чамберс

17

Если вы хотите отменить все файлы, которые были применены, пропустите рабочее дерево, вы можете использовать следующую команду:

git ls-files -v | grep -i ^S | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree
  1. git ls-files -v распечатает все файлы с их статусом
  2. grep -i ^S будет фильтровать файлы и выбирать только пропустить рабочее дерево (S) или пропустить рабочее дерево и предполагать, что оно не изменено, -i означает игнорировать регистр
  3. cut -c 3- удалит статус и оставит только пути, вырезая из 3-го символа до конца
  4. tr '\012' '\000' заменит символ конца строки (\ 012) на ноль (\ 000)
  5. xargs -0 git update-index --no-skip-worktreeпередаст все пути, разделенные нулевым символом, git update-index --no-skip-worktreeчтобы отменить

1
Это лучший ответ
Dev

Этот ответ - чистое золото!
Йоссико

7

Основываясь на ответе @ GuidC0DE, вот версия для Powershell (я использую Posh-Git )

git update-index --no-skip-worktree $(git ls-files -v | sls -pattern "^S"| %{$_.Line.Substring(2)})

И для справки также противоположная команда, чтобы скрыть файлы:

git update-index --skip-worktree $(git ls-files --modified)

3

Для тех, кто использует Toritise Git:

  1. Щелкните правой кнопкой мыши на папке или на конкретном файле, затем выберите TortoiseGit > Check for modifications
  2. Только проверяй Show ignore local changes flagged files. Вы должны увидеть файл, который вы проигнорировали (или все файлы, которые вы проигнорировали, если вы щелкнули правой кнопкой мыши по папке)
  3. Щелкните правой кнопкой мыши по файлу и выберите Unflag as skip-worktree and assume-unchanged

3

Для всех вас, кто любит псевдонимы Bash, вот мой набор, чтобы управлять ими всеми (на основе C0DEF52)

alias gitskip='git update-index --skip-worktree ' #path to file(s)
alias gitlistskiped='git ls-files -v | grep ^S'
alias gitunskip='git update-index --no-skip-worktree ' #path to file(s)
alias gitunskipall='git ls-files -v | grep -i ^S | cut -c 3- | tr ''\\012'' ''\\000'' | xargs -0 git update-index --no-skip-worktree'

0

Этот ответ предназначен для менее технических людей, использующих Windows.

Если вы не помните / не знаете, в каких файлах вы нажали «skip-worktree», используйте:

git ls-files -v             //This will list all files, you are looking for the ones with an S at the beginning of the line. 

git ls-files -v | grep "S " //Use this to show only the lines of interest. Those are the files that have "skip-worktree".

Чтобы исправить вашу проблему:

Вы можете перейти к файлам -> щелкнуть правой кнопкой мыши -> восстановить предыдущую версию -> нажать на вкладку «git» сверху -> снять флажок «skip-worktree» -> нажать «Применить» внизу.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.