Як налаштувати git для ігнорування деяких файлів локально?


1350

Чи можу я ігнорувати файли локально, не забруднюючи глобальну конфігурацію git для всіх інших? У мене є не відстежені файли, які є моїм статусом git, але я не хочу вносити зміни конфігурації git для кожного маленького випадкового нерозібраного файлу, який я маю в своїх місцевих відділеннях.

Відповіді:


1861

З відповідної документації на Git :

Шаблони, характерні для певного сховища, але не потребують їх спільного використання з іншими пов'язаними сховищами (наприклад, допоміжні файли, що живуть всередині сховища, але характерні для робочого процесу одного користувача), повинні зайти у $GIT_DIR/info/excludeфайл.

.git/info/excludeФайл має той же формат , як і будь-який .gitignoreфайл. Інший варіант - встановити core.excludesFileім’я файлу, що містить глобальні зразки.

Зауважте, якщо у вас уже є нестандартні зміни, після редагування шаблонів ігнорування слід виконати наступне:

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

Зверніть увагу на$GIT_DIR : Це позначення використовується в усьому керівництві мерзотника просто вказати шлях до сховища мерзотника. Якщо встановлена ​​змінна середовище, вона змінить місце розташування того місця, де ви знаходитесь, що, можливо, не є тим, що вам потрібно.


Редагувати : Ще одним способом є використання:

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

Зворотне значення:

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

204
Як зауваження, переконайтеся, що запустіть git update-index --assume-unchanged [<file>...]після внесення до файлу виключення. Зміни не будуть прийняті до цього часу.
толманз

30
Мені не потрібно було запускати 'git update-index ...', щоб зміни вступили в силу за допомогою git 1.7.9.5.
Джефрі Мартінес

39
Використовувати git update-index вам потрібно лише тоді, коли ви вже внесли зміни у файл і тепер хочете, щоб його ігнорували. Якщо ви змінили виключити до внесення змін, це не обов'язково.
Брейді Емерсон

13
Незважаючи на те, що файл не відображається як змінений під час комісій, таких як .gitignore, на відміну від ігнорованих файлів, файл (и) все одно буде повернуто до версії repo, якщо виконати скидання git --hard.
Брейді Емерсон

19
Згідно з stackoverflow.com/questions/23097368/… та stackoverflow.com/questions/13630849/… , skip-worktreeшвидше за все, віддадуть перевагу assume-unchanged.
danShumway

436

Оновлення : Подумайте про використання git update-index --skip-worktree [<file>...], дякую @danShumway! Див . Пояснення Бореаліда щодо різниці двох варіантів .


Стара відповідь:

Якщо вам потрібно ігнорувати локальні зміни відсліджених файлів (у нас це є з локальними модифікаціями для налаштування файлів), використовуйте git update-index --assume-unchanged [<file>...].


8
Зауважимо, я додав файл до $ GIT_DIR / info / виключити (наприклад, my-file.php), а потім довелося запустити git update-index --assume-unchanged my-file.phpйого, щоб почати його ігнорувати. Дякую за пораду!
толманз

78
Щоб скасувати це: git update-index --no-assume-unchanged my-file.php
Рей

18
Тільки для уточнення: припустимо, що незмінним є відслідковувані файли (існують у репо) ... ОП запитувало неперевірені файли, в цьому випадку .git/info/excludeви хочете (щоб уникнути забруднення часто використовуваних та відслідкованих .gitignore)
dyodji

7
Згідно з stackoverflow.com/questions/23097368/… це вважається небезпечним, і ваші файли все ще можуть бути скоєні, якщо ви не будете обережні. Він призначений як допоміжний засіб для виконання, а не як нерозумне рішення цієї проблеми.
danShumway

3
Я кинувся до того, --assume-unchangedяк прочитати ваше оновлення . Я розв’язав, --no-assume-unchangedа потім зробив --skip-worktree... Чи я в чистоті?
Nicolas Miari

162

Додайте наступні рядки до розділу [псевдонім] вашого файлу .gitconfig

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

Тепер ви можете git ignore my_fileігнорувати зміни в локальному файлі та git unignore my_fileприпиняти ігнорувати зміни. git ignoredперелічує ігноровані файли.

Цю відповідь було отримано з http://gitready.com/intermediate/2009/02/18/temporary-ignoring-files.html .


1
"! git ls-files -v | grep" ^ [[: нижня:]] "- Будь-який шанс ви знаєте, як це зробити на Windows cmd?
Haohmaru

3
Встановіть справжню оболонку (наприклад, Babun надає bash або zsh);) Я знаю ваші почуття, але нещодавно я перейшов з Windows на Linux і більше ніколи не буду використовувати cmd.
Ксерус

@Haohmaru, ви завжди можете використовувати WSL (підсистема Windows для Linux).
A Sz

110

У вас є кілька варіантів:

  • Залиште брудний (або недозволений) .gitignoreфайл у своєму робочому режимі (або застосуйте його автоматично, використовуючи topgit або інший подібний інструмент для виправлення).
  • Помістіть виключення у своє $GIT_DIR/info/exclude файл, якщо це характерно для одного дерева.
  • Запустіть git config --global core.excludesfile ~/.gitignoreі додайте шаблони до своїх ~/.gitignore. Ця опція застосовується, якщо ви хочете ігнорувати певні шаблони для всіх дерев. Я використовую це для .pycі .pyoфайлів, наприклад.

Також переконайтеся, що ви використовуєте шаблони, а не чітко перераховувати файли, коли це можливо.


10
Я думаю, що вам потрібно git config --globalвстановити параметр у всьому світі.
Джош Лі

7
Власне, просто додай .gitignore до .gitignore;)!
Домінік Джордж

68

Я думаю, ти шукаєш:

git update-index --skip-worktree FILENAME

які ігнорують зміни, зроблені локально

Ось http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ більше пояснень щодо цього рішення!

скасувати використання:

git update-index --no-skip-worktree FILENAME

9
Існує відповідне обговорення між --skip-worktreeі --assume-unchangedв цьому питанні SO
Merwer

1
Як я можу скасувати це або побачити список файлів / шаблонів, які зараз ігноруються через --skipworktree, чи слід пізніше змінити свою думку і хочу знову почати відстежувати файл?
Аномалія

1
як це скасувати?
користувач1735921

3
Щоб скасувати, скористайтесяgit update-index --no-skip-worktree <file>
user1735921

49

Ви можете встановити кілька git псевдонімів, щоб зробити цей процес простішим. Це редагує [alias]вузол вашого .gitconfigфайлу.

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

Ці ярлики, які ви встановлюєте для вас, такі:

  • git ignore config.xml
    • git зробить вигляд, що не бачить жодних змін config.xml- заважаючи випадково вчинити ці зміни.
  • git unignore config.xml
    • git відновить підтвердження змін config.xml- дозволить вам знову вчинити ці зміни.
  • git ignored
    • git перелічить усі файли, які ви "ігноруєте", як описано вище.

Я побудував це, посилаючись на відповідь phatmann - в якій представлена --assume-unchangedверсія того ж.

Я представлена ​​версіями --skip-worktreeдля ігнорування місцевих змін. Дивіться відповідь Borealid для повного пояснення різниці, але, по суті --skip-worktree, її мета полягає в тому, щоб розробники міняли файли без ризику вчинити їх зміни .

git ignoredКоманда , представлена тут використовує git ls-files -vі фільтрує список , щоб показати тільки ті записи , починаючи з Sтега. SТег позначає файл, статус якого є «пропустити worktree». Повний список статусів файлів, показаний git ls-files: див. Документацію для -tопції на git ls-files.


1
Це не працює для файлів, що не відслідковуються: <(git 2.13.5 on osx)
Terra Ashley

Це "!" повинен бути в '!git ls-files -v | grep "^S"'? Команда не працює для мене там, і там, здається, добре працює з видаленою.
Тіріс

знак оклику в псевдонімі git вказує git виконувати зовнішню команду , а не підкоманду git . Я вкладаю його, бо мені потрібен конвеєр оболонки, тому мені потрібно викликати git ззовні. Я просто спробував зняти знак оклику (відповідно до вашої рекомендації), але це не працює для мене. Я отримую Expansion of alias 'ignored' failed; 'git' is not a git command. Це має сенс; без знака оклику: git псевдоніми вашої команди git git ls-files ….
Birchlabs

Дякую за пояснення. Я не знайомий з псевдонімом git і просто працював у оболонці, щоб перевірити перед тим, як зробити псевдонім.
Тіріс

Це геніальне рішення. Оскільки треки git за каталогом під час запуску вищезазначеного псевдоніма git ignore <filename>, він застосовується лише до цього каталогу. І коли ви нарешті захочете внести зміни до цього файлу та здійснити перехід та натиснути на віддалений, просто скористайтеся зручним, git unignore <filename>щоб тимчасово знову почати його відстежувати! Дякую!
nickang

42

Ви можете просто додати .gitignore файл у свій домашній каталог, тобто $HOME/.gitignoreабо ~/.gitignore. Потім скажіть git використовувати цей файл із командою:

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

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

Я вже багато років використовую цей підхід із великими результатами.


Дякую, @EricChen Я оновив відповідь; спробуйте, а потім використовуйте git check-ignore <file-name>для перевірки. LMK, якщо це працює для вас
JESii

Це працювало для мене лише без =:git config --global core.excludesfile ~/.gitignore
Е. Сундін

Я помістив .gitignoreфайл під домашній каталог і сказав git використовувати цей файл замість цього, а потім видалив файли, які я хотів би відстежувати локально. Однак після того, як я натиснув зміни, віддалений сховище також видалив ці файли. Я щось не так зробив?
zyy

Нічого собі, @xyz; .gitignoreйдеться про ігнорування файлів, які існують у вашому локальному каталозі. Що ви повинні зробити, це git rm --cachedвилучити їх з репо, але залишити їх у ваших місцевих. Ви повинні мати змогу повернутися до попередньої фіксації чимось на зразок git reset --soft HEAD^скасувати цю фіксацію та відновити ваші файли. Ось така краса git: це все ще є у вашій історії git.
JESii

2

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


1
Чудово! FYI: Це працює лише тому, що git відстежує (і дозволяє робити файли) файли, а не папки.
jmiserez

-2

Якщо у вашого репо вже немає файлу .gitignore, тоді простим рішенням є створення файлу .gitignore та додавання .gitignoreдо списку файлів, які слід ігнорувати.


4
А що робити, якщо команда потім хоче додати, щоб пізніше додати ґітігнор? Це навіть працює? Здається, як жахлива ідея і щось подібне, що навіть не повинно працювати.
Бьорн

Відповідь цього хлопця зламала мене. Ні в кого це не робиться.
Мартін Чемберлін

Це швидке і просте рішення, якщо є де його поставити. У нашої репо .gitignoreвгорі є спільний файл. Але мої брудні файли знаходяться у глибокій папці, тому я просто додав свої власні .gitignoreпоруч із ними. +1
joeytwiddle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.