Як ігнорувати певні файли в Git


731

У мене є сховище з файлом, Hello.java. Коли я компілюю його, Hello.classгенерується додатковий файл.

Я створив запис Hello.classу .gitignoreфайлі. Однак файл все ще видається відстеженим.

Як я можу змусити ігнорувати Git Hello.class?


8
Що ви маєте на увазі «це не працює»? Ви, можливо, вже додали Hello.class до вашого сховища? gitignores не впливають на вміст, який уже відстежується. Дивіться, наприклад, stackoverflow.com/questions/1139762/gitignore-file-not-ignoring
Cascabel

Відповіді:


809

Проблема полягає в тому, що .gitignoreігнорується лише файли, які раніше не відслідковувалися (від git add). Запустіть, git reset name_of_fileщоб видалити файл і зберегти його. Якщо ви хочете також видалити даний файл із сховища (після натискання), використовуйте git rm --cached name_of_file.


190
Команда git rm --cached name_of_fileвидалить файл із вашого git repo. Навіть якщо ви додасте його у свій .gitignore файл. Це не ігнорування того, що видалення.
OrwellHindenberg

4
Що, здається, було те, чого хотів ОП у цьому випадку.
Ondrej Slinták

40
Я радий, що ваше рішення працювало на @ Kohan95! Хоча це питання слід перейменувати на основі обраної відповіді. Мої коментарі - це лише попередження для розробників, які можуть не усвідомлювати, що робить команда.
OrwellHindenberg

91
git reset name_of_fileвидаляє стеження та не видаляє файл.
Cees Timmerman

7
Спробував git rm --cached <name_of_file> Це видалив файл у репо, але оскільки він знаходився у файлі .gitignore, локальна копія не була видалена. В якості додаткової примітки, щоб додати каталог, вам потрібно помістити його з кінцевою косою нахилом вперед '/'. Я видаляв конфігураційний каталог Rubymine в рубіновому проекті, який хтось зареєстрував, який був ".idea". У файл я помістив ".idea /", а потім "git rm --cached -r .idea", щоб видалити каталог і все, що знаходиться в ньому (тому що git тільки файли версій, а не каталоги.)
Doug Noel

222

Як ігнорувати нові файли

В усьому світі

Додайте до свого файлу шлях (и), який ви хочете проігнорувати у своєму .gitignoreфайлі (і скопіюйте їх). Ці записи файлів також стосуватимуться інших, хто перевіряє сховище.

Місцево

Додайте до свого файлу шлях (і), який ви хочете проігнорувати у своєму .git/info/excludeфайлі. Ці записи файлів стосуються лише вашої місцевої робочої копії.

Як ігнорувати змінені файли (тимчасово)

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

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

Щоб повернути це незнання, використовуйте таку команду:

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

Ідеально підходить для запобігання натискання файлу, що містить поточний ключ api, в github!
Джим у Техасі

1
@Xman Чому ти сказав, що це тимчасово? Я зробив кроки, які ви згадали для localgit, ігноруючи, і перезапустив мою систему, вона все ще показує роботу безпосередньо в чистоті.
Vivek Vardhan

1
Дякуємо за корисний update-indexтрюк, абсолютно ідеальний, щоб уникнути зміни .gitignoreфайлу, який потім відстежується Git!
Thomas P.

@mcbjam Немає спеціальної команди ігнорування git. Відредагуйте .gitignore файл, розташований у відповідному місці в робочій копії. Потім слід додати цей .gitignore та здійснити його. Кожен, хто клонує цей репо, буде ігнорувати ці файли.
Xman Classical

@Vivek Vardhan git update-index --assume-unchanged - це як тимчасова маска індексу. Він діятиме, поки ви не вимкнете його. Щоб зробити мою думку більш зрозумілою, спочатку індекс (тобто відразу після git read-tree) "містить" всі файли з дерева, які тільки що прочитали. Отже, змушуючи Git "заплющувати очі" на запис в індексі не дорівнює фактичному видаленню.
Xman Classical

150

Додайте наступний рядок до .gitignore:

/Hello.class

Це виключить Hello.class з git. Якщо ви вже зробили це, виконайте таку команду:

git rm Hello.class

Якщо ви хочете виключити всі файли класу з git, додайте наступний рядок до .gitignore:

*.class

32
Додавання Hello.classдо .gitignoreігнорує будь-який файл, викликаний Hello.classу будь-якому підкаталозі. Якщо ви маєте намір ігнорувати файл лише Hello.classв тому самому каталозі, що і .gitignoreфайл, скористайтеся /Hello.classзамість нього рядком.
ndim

Куди ви кладете .gitignoreфайл?
CodyBugstein

6
@Imray ви можете розмістити в .gitignoreбудь-якому місці git-проекту - якщо шлях починається з /, це буде відносно розташування .gitignoreфайлу; в іншому випадку він буде рекурсивно посилатися на файли в поточному каталозі та його нащадках.
Арман

109

1) Створіть .gitignoreфайл. Для цього потрібно просто створити .txtфайл і змінити розширення так:

Введіть тут опис зображення

Потім потрібно змінити ім'я, записавши наступний рядок у вікно cmd:

 rename git.txt .gitignore

Де git.txtназва файлу, який ви тільки що створили.

Тоді ви можете відкрити файл і записати всі файли, які ви не хочете додати у сховище. Наприклад, моя виглядає так:

#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
~$*

Після цього вам потрібно додати його до вашого сховища Git. Ви повинні зберегти файл, де знаходиться ваше сховище.

Тоді в Git Bash потрібно написати наступний рядок:

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

Якщо сховище вже існує, вам потрібно зробити наступне:

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

Якщо крок 2 не працює, слід записати весь маршрут файлів, які ви хочете додати.


Ви можете скористатися командою "скопіювати con .gitignore" у вікні, а потім натиснути CTRL + Z, щоб безпосередньо створити файл без Windows Explorer.
heringer

61

Ігнорувати:

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

Щоб скасувати ігнорування:

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

6
Я хотів би, щоб це було вгорі діаграми як рішення проблеми .... Його дуже просте та елегантне
user1457958

"Його дуже просто і елегантно" - не дуже : "Припустимо, що без змін не слід зловживати механізмом ігнорування. Це "я знаю, що моя файлова система працює повільно. Я пообіцяю Git, що я не зміню ці шляхи ..." Тим більше, це не обіцянка ... що Git завжди вважатиме ці шляхи немодифікованими - якщо Git зможе визначити шлях … Змінився без додаткових lstat(2)витрат, він залишає за собою право повідомити, що шлях був змінений (… git commit -aвільний здійснити цю зміну).
Кріс

47

Ви можете використовувати методи нижче, щоб ігнорувати / не ігнорувати зміни в відстежуваних файлах.

  1. Для ігнорування: git update-index --assume-unchanged <file>
  2. Для відновлення ігнорованих файлів: git update-index --no-assume-unchanged <file>

4
Це стосується всіх файлів? Незрозуміло, як ці команди можуть бути застосовані до одного файлу для того, щоб його ігнорувати / однозначно відкидати.
javadba

@kapil нарешті !! те, що насправді працює серед трильйона варіантів команд git! Спробував кожну відповідь, щоб ігнорувати деякі дурні файли build.xml, які з'являлися після кожної збірки ... дякую!
killjoy

1
Будь ласка, не : "Припустимо, що без змін не слід зловживати механізмом ігнорування. Це "я знаю, що моя файлова система працює повільно. Я пообіцяю Git, що я не зміню ці шляхи ..." Тим більше, це не обіцянка ... що Git завжди вважатиме ці шляхи немодифікованими - якщо Git зможе визначити шлях … Змінився без додаткових lstat(2)витрат, він залишає за собою право повідомити, що шлях був змінений (… git commit -aвільний здійснити цю зміну).
Кріс

22

Створіть .gitignoreу каталозі, де знаходиться .git. Ви можете перелічити в ньому файли, розділені новим рядком. Ви також можете використовувати підстановку:

*.o
.*.swp

3
Рекомендується уникати розміщення у .gitignoreфайлах специфічних шаблонів (тобто тимчасових файлів Vim) (якщо цей інструмент не передбачений проектом). Ви можете розмістити шаблони для ваших улюблених інструментів у файлі (наборі core.excludesFile) для кожного користувача; вони працюватимуть у всіх ваших сховищах. Наприклад git config --global core.excludesFile "$HOME/.git-user-excludes", потім помістіть їх у цей файл.
Кріс Джонсен

@Chris: Дякую за пораду. Але я просто написав це там, тому що нічого кращого мені не прийшло в голову :)
термін

1
@ChrisJohnsen "інструмент специфічний?" для vim ?? Я думаю, що безпечно виключати файли swap vim ..
javadba

16

З офіційного сайту GitHub:

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

git rm --cached FILENAME

або

git rm --cached .

12

Вам слід написати щось подібне

*.class

у ваш .gitignoreфайл.


4
@AgentZebra Ви повинні додати запис *.classдо свого .gitignoregit, щоб ігнорувати всі файли, що закінчуються на .class.
KingCrunch

7

Додайте, які файли потрібно ігнорувати .gitignore:

* .клас

* .проекти

* .преф

* .проект



5

Якщо ви вже зробили файл і ви намагаєтесь проігнорувати його, додавши до нього .gitignore, Git не буде ігнорувати його. Для цього спочатку потрібно зробити наступні речі:

git rm --cached FILENAME

Якщо ви починаєте проект щойно і хочете додати деякі файли до ігнорування Git, виконайте наведені нижче дії, щоб створити файл ігнорування Git:

  1. Перейдіть до вашого сховища Git.
  2. Введіть "touch .gitignore", який створить .gitignoreфайл.

3

Ви також можете використовувати .gitattributes (замість .gitignore), щоб виключити цілі файли. Файл досить зрозумілий, але я вставлю його тут для довідок. Зверніть увагу на останній рядок (* .class binary):

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.mo binary
*.pdf binary
*.phar binary
*.class binary

2

Додайте наступний рядок до .git / info / виключити:
Hello.class


Ви повинні змінити файли всередині папки .git?
Пітер Мортенсен

Можливо, не гарна ідея торкатися цих файлів під .git вручну.
mgyky

2

У мене була схожа проблема з файлом "dump.rdb".
Я намагався додати цей файл різними способами .gitignore файл, але працював лише один спосіб.

Додайте своє ім’я файлу в кінці файлу .gitignore

ПРИМІТКА. Додавання файлу в іншому місці не працювало.

Наприклад, див .: https://gitlab.com/gitlab-org/gitlab-ce/raw/b3ad3f202478dd88a3cfe4461703bc3df1019f90/.gitignore


2

Ця веб-сторінка може бути корисною та економією часу при роботі .gitignore.

Він автоматично генерує .gitignore файли для різних IDE та операційних систем із певними файлами / папками, які зазвичай не хочеться перетягувати у ваше сховище Git (наприклад, специфічні папки та конфігураційні файли для IDE).


1

Я спробував це -

  1. список файлів, які ми хочемо ігнорувати

git status .idea/xyz.xml .idea/pqr.iml Output .DS_Store

  1. Скопіюйте вміст кроку №1 та додайте його у файл .gitignore.

echo " .idea/xyz.xml .idea/pqr.iml Output .DS_Store" >> .gitignore

  1. Підтвердити

git status .gitignore

так само ми можемо додати каталог та всі його підручні файли / файли, які ми хочемо ігнорувати у статусі git, використовуючи directoryname/*цю команду, і я виконав цю команду з srcкаталогу.


1
  1. Перейдіть до файлу .gitignore та додайте запис до файлів, які ви хочете проігнорувати
  2. Біжи git rm -r --cached .
  3. Тепер біжи git add .

0

Я спробував --assume-unchangedі також, .gitignoreале не працював добре. Вони ускладнюють перемикання гілок і важко об'єднувати зміни з іншими. Це моє рішення:

Коли я здійснюю , я вручну видаляю файли зі списку змін

Перед тим, як тягнути , я ховаю змінені файли. А після тяги я роблю приховану попсу .

  1. git stash
  2. git pull
  3. git stash pop

Крок 3 іноді спровокує злиття і може призвести до конфлікту, який потрібно вирішити, що добре.

Це дозволяє мені зберігати локальні зміни, які не поділяються з іншими в колективі.

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