Примените .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.