Примените .gitignore к существующему хранилищу, уже отслеживающему большое количество файлов.


314

У меня есть существующий проект Visual Studio в моем хранилище. Недавно я добавил файл .gitignore в свой проект, и я предполагаю, что это говорит Git игнорировать файлы, перечисленные в файле.

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

Было предложено использовать: git rm --cachedи вручную отследить их, но это займет у меня навсегда, чтобы просмотреть их один за другим.

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


1
вы можете git rm --cachedцелые каталоги с -rопцией, если это полезно
Натан Уоллес



Ответы:


871

Этот ответ решил мою проблему:

Прежде всего, передайте все ожидающие изменения.

Затем выполните эту команду:

git rm -r --cached .

Это удалит все из индекса, затем просто запустите:

git add .

Передайте это:

git commit -m ".gitignore is now working"

9
Идеальный ответ! Пожалуйста, добавьте git push originтакже, чтобы отразить изменения в удаленном хранилище.
Санкет Берде

8
Я начал использовать этот ответ ... и он удалил почти все в моем проекте! Очевидно, я делал что-то не так. Но я хочу предупредить людей не следовать этому предложению случайно.
Марк Олберт

4
Это приводит к потере истории файлов при удалении и повторном их добавлении
Аран Малхолланд,

10
Интересно, сколько коммитов используют это .gitignore is now workingсообщение? :)
ihavenoidea

1
Этот метод работал хорошо для меня. Я создал файл gitignore, проигнорировал весь каталог, а затем передал это изменение создания gitignore. Затем я следовал этим трем командам выше, в точности так, как они сказали. Это сработало отлично, но я должен сказать, что сначала вы должны «зафиксировать все ожидающие изменения», как указано выше.
Эрих Мейснер

61
  1. Создайте файл .gitignore, поэтому для этого просто создайте любой пустой файл .txt.

  2. Затем вы должны изменить его имя, написав следующую строку в cmd (где git.txtнаходится имя файла, который вы только что создали):

    rename git.txt .gitignore

  3. Затем вы можете открыть файл и записать все неотслеживаемые файлы, которые вы хотите игнорировать навсегда. Например, мой выглядит так:

`` `

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Существует целая коллекция полезных файлов .gitignore от GitHub.

  1. Если у вас есть это, вам нужно добавить его в свой репозиторий git, как и любой другой файл, только он должен находиться в корне репозитория.

  2. Затем в вашем терминале вы должны написать следующую строку:

    git config --global core.excludesfile ~ / .gitignore_global

Из официального документа:

Вы также можете создать глобальный файл .gitignore, который представляет собой список правил для игнорирования файлов в каждом репозитории Git на вашем компьютере. Например, вы можете создать файл в ~ / .gitignore_global и добавить к нему некоторые правила.

Откройте Терминал. Запустите следующую команду в своем терминале: git config --global core.excludesfile ~ / .gitignore_global

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

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

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


4
@Karen_Wiznia "git config ... _global" создает глобальный gitingore для всех репозиториев Git на компьютере. ОП не хотел этого делать.
ivan7707

Хотелось бы, чтобы мне это нравилось не раз, я постоянно возвращаюсь к этому вопросу в поисках этого напоминания.
Антоний д'Андреа,

1
Это должно быть "mv git.txt .gitignore" вместо "переименовать git.txt .gitignore".
Ахмад Ф

30

Как указано здесь, вы можете обновить индекс:

git update-index --assume-unchanged /path/to/file

При этом файлы не будут отображаться в git statusили git diff.

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

git update-index --no-assume-unchanged /path/to/file

5
Это лучший ответ - он ориентирован только на один файл, файл, который вы не хотите отслеживать в хранилище. Ответ с наивысшей отметкой также будет работать, но он делает гораздо больше, чем просто игнорирует файл, отслеживаемый git.
Крис Мейка

1
Это хороший. Но что если мы потянем? Есть ли конфликты слияния?
Прамод

@Pramod, отличный вопрос. Я не совсем уверен. Попробуйте это в урезанном тестовом хранилище?
Патрик Джеймс Макдугл

15

Если вы добавили .gitignoreслишком поздно, git продолжит отслеживать уже принятые файлы независимо Чтобы это исправить, вы всегда можете удалить все кэшированные экземпляры нежелательных файлов.

Во-первых, чтобы проверить, какие файлы вы отслеживаете, вы можете запустить:

git ls-tree --name-only --full-tree -r HEAD

Допустим, вы нашли нежелательные файлы в каталоге, например, cache/так что безопаснее ориентироваться на этот каталог, а не на все ваши файлы.

Так что вместо:

git rm -r --cached .

Безопаснее выбрать целевой файл или каталог:

git rm -r --cached cache/

Затем добавьте все изменения,

git add .

и совершить ...

git commit -m ".gitignore is now working"

Ссылка: https://amyethedge.com/code/13.html


Это лучший и чистый ответ, если вы хотите удалить только несколько файлов, а не весь репозиторий. Я отдаю тебе свои пальцы.
Апуиг

2

Вот один из способов «отследить» любые файлы, которые иначе были бы проигнорированы в текущем наборе шаблонов исключения:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

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

Уловка, используемая здесь, состоит в том, чтобы предоставить несуществующий индексный файл для git-файлов, чтобы он думал, что нет отслеживаемых файлов. Приведенный выше код оболочки запрашивает все файлы, которые были бы проигнорированы, если бы индекс был пустым, а затем удаляет их из фактического индекса с помощью git rm.

После того, как файлы были «не отслежены», используйте git status, чтобы убедиться, что ничего важного не было удалено (если это так, измените шаблоны исключения и используйте git reset - путь для восстановления удаленной записи индекса). Затем сделайте новый коммит, который пропустит «crud».

«Crud» по-прежнему будет в любых старых коммитах. Вы можете использовать git filter-branch для создания чистых версий старых коммитов, если вам действительно нужна чистая история (например, использование git filter-branch будет «переписывать историю», поэтому не стоит предпринимать это легко, если у вас есть соавторы, которые вытянули любой из ваших исторических коммитов после того, как «груда» была впервые представлена).


звучит как солидное решение :) Я предполагаю, что это для Linux оболочки правильно? к сожалению, я пользователь Win7. В любом случае я могу сделать это в Windows?
Tohid

0

Удалить файлы из области подготовки

git reset HEAD .

Добавить все изменения

git add .

Передайте это:

git commit -m ".gitignore is now working"

-1

Я думаю, что это простой способ добавить файл .gitignore в существующий репозиторий.

Предварительное условие :

Вам нужен браузер для доступа к вашей учетной записи на github.

меры

  1. Создайте новый файл в вашем необходимом (существующем) проекте и назовите его .gitignore . Вы получите подсказку для шаблонов .gitignore, как только вы назовете файл .gitignore . Либо используйте эти шаблоны, либо используйте gitignore.io для создания содержимого файла gitignore .
  2. Зафиксируйте изменения.
  3. Теперь клонируйте этот репозиторий.

Радоваться, веселиться!


-3

Используйте git clean
Получить помощь в этом запуске

git clean -h

Если вы хотите увидеть, что произойдет первым, обязательно пропустите ключ -n для пробного запуска:

git clean -xn

Чтобы удалить мусор

git clean -xdf

Осторожно: Вы можете игнорировать локальные конфигурационные файлы, такие как database.yml, которые также будут удалены. Используйте на свой риск.

затем

git add .
git commit -m ".gitignore is now working"
git push
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.