Скасувати git update-index --skip-worktree


148

Деякий час тому я робив це, щоб ігнорувати зміни у файлі, відстежуваному git:

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

Тепер я фактично хочу внести зміни до цього файлу до джерела. Як скасувати ефекти від skip-worktree?


11
Мене також цікавить, як отримати список файлів у стані "пропустити робоче дерево"?
troex

Відповіді:



35

Відповідно до http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html , використовуйте

git ls-files -v

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

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


9
Акуратний. Я можу використовувати git ls-files -v | grep '^S'для перерахування лише файлів, які я "приховав" за допомогою пропускного робочого дерева. Сподівався зробити псевдонім "прихованим" для цієї команди, але введення псевдонаправлення в псевдонім, схоже, не спрацювало.
amacleod

5
@amacleod використання a !. Як цей [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) або пропустити робоче дерево та припустити, що вони не змінюються, -і означає ігнорувати регістр
  3. cut -c 3- видалить статус і залишить лише контури, перерізаючи з третього символу до кінця
  4. tr '\012' '\000' замінить символ кінця рядка (\ 012) на нульовий символ (\ 000)
  5. xargs -0 git update-index --no-skip-worktreeпередасть усі шляхи, розділені нульовим символом, git update-index --no-skip-worktreeдо скасування

1
Це найкраща відповідь
Dev

Ця відповідь - чисте золото!
yossico

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

Для тих, хто використовує черепаху Git:

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

3

Для всіх вас, хто любить псевдоніми Баша, ось мій набір керувати ними всім (на основі 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.

Якщо ви не пам'ятаєте / не знаєте, на які файли ви натиснули "пропустити робоче дерево", тоді використовуйте:

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" вгорі -> зніміть прапорець "пропустити робоче дерево" -> натисніть "Застосувати" внизу.

Якщо файлів занадто багато, щоб виправити вручну, тоді вам потрібно буде звернутися до інших відповідей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.