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

148

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

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

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

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

Ответы:

202

Ага! Я просто хочу:

git update-index --no-skip-worktree <file>
Кевин Берк
источник
8
Я люблю Ага!
Руто Коллинз
1
кто бы это
сделал
1
Ага! = Эврика! : D
Даут
Я мог бы сделать это!
Том Падилья
Почему лучший ответ внизу страницы
Карл Крегер Ил
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чтобы отменить
C0DEF52
источник
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)
eXavier
источник
3

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

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

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

Божидар Станчев
источник