Применение.gitignore к подтвержденным файлам

Я зафиксировал множество файлов, которые теперь хочу игнорировать. Как я могу сказать git игнорировать эти файлы от будущих коммитов?

РЕДАКТИРОВАТЬ: я тоже хочу удалить их из хранилища. Это файлы, созданные после сборки или для поддержки пользовательских инструментов.

11 ответов

Решение

После редактирования .gitignore чтобы соответствовать проигнорированным файлам, вы можете сделать git ls-files -ci --exclude-standard просмотреть файлы, включенные в списки исключений; Вы можете сделать git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached удалить их из репозитория (не удаляя их с диска).

Редактировать: вы также можете добавить это как псевдоним в ваш файл.gitconfig, чтобы вы могли запускать его в любое время. Просто добавьте следующую строку в раздел [alias]:

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

(The -r флаг в xargs предотвращает git rm запускать пустой результат и распечатывать его сообщение об использовании, но может поддерживаться только GNU findutils. Другие версии xargs может иметь или не иметь аналогичный вариант.)

Теперь вы можете просто набрать git apply-gitignore в вашем репо, и он сделает всю работу за вас!

Чтобы оставить файл в репозитории, но игнорировать будущие изменения в нем:

git update-index --assume-unchanged <file>

и отменить это:

git update-index --no-assume-unchanged <file>

чтобы узнать, какие файлы были установлены таким образом:

git ls-files -v|grep '^h'

благодарность за оригинальный ответ на http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/

Убедитесь, что ваш реальный репозиторий - самая последняя версия

  1. редактировать .gitignore как хотите
  2. git rm -r --cached .
  3. git add .

затем совершите как обычно

Старый вопрос, но некоторые из нас находятся в git-posh (PowerShell). Это решение для этого:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }
  1. Добавьте ваше имя файла / путь к файлу в .gitignore файл.
  2. Теперь запустите команду в git bash git rm --cached file/path/from/root/folder
  3. Теперь зафиксируйте свой код, используя git commit.

Теперь файл не должен отслеживаться в git status команда.

После редактирования файла .gitignore.

      git rm -r --cached ./ &&  git add ./ && git commit -a -m "Removing ignored files" && git push

Я склонен забывать/мне лень читать, что делают эти команды git. Поэтому я делаю это так:

  • Я временно перемещаю все файлы, которые хочу игнорировать, за пределы репозитория
  • Я фиксирую эти «удаленные файлы» в своем графическом интерфейсе git (теперь они не отслеживаются)
  • Я обновляю файл .gitignore
  • Я перемещаю файлы обратно в репозиторий (или удаляю их, если это было моим намерением)

Если вы загружаете с помощью git rm много файлов (скажем, 100 тысяч), ответы в этой теме можно улучшить, обработав список файлов (созданныйgit ls-files -ci --exclude-standard) партиями. (AFAIK, параллельная обработка не будет работать с git из-за его механизма блокировки индекса.)

Пример пакетной обработки в Powershell:

      $files = git ls-files -ci --exclude-standard
$batchSize = 100

for ($i = 0; $i -lt $files.Count; $i += $batchSize) {
    $batch = $files[$i..($i + $batchSize - 1)]
    git rm -f --cached $batch
}

В Windows верхняя граница — это предел длины командной строки. Для коротких путей вам может сойти с рук больший a.$batchSize.

Если вы уже совершили, вы можете использовать это:

  1. Добавьте путь к папке в файл .gitignore.
  2. Запустите эту команду для удаления exe-файлов (для файлов с другими расширениями просто напишите «*extension»). git rm --cached *exe
  3. Зафиксировать изменения.

Вы должны сделать это для каждого расширения, которое хотите удалить.

Следуй этим шагам:

  1. Добавить путь к gitignore файл

  2. Запустите эту команду

    git rm -r --cached foldername
    
  3. совершать изменения как обычно.

Другие вопросы по тегам