за допомогою gitignore для ігнорування (але не видалення) файлів


97

У мене в git repo є каталог tmp, який я хотів би існувати, але ігнорувався. Я додав його .gitignore, але git statusвсе ще розповідає про зміни у файлах у цьому каталозі. Я спробував git rm -r --cached, але це видаляє його з віддаленого репо. Як я можу зупинити відстеження змін у цьому каталозі, але все ж дозволити його існуванню? Я також повинен зробити це для 1 файлу, але зміни в ньому також з'являються git statusпісля .gitignoreїх введення . Що я повинен зробити?


1
будь ласка, запишіть, як саме виглядає ваш файл .gitignore?
kdehairy

Відповіді:


182

Замість цього .gitignoreви можете оновити локальне сховище git, виконавши наступну команду:

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

У цьому випадку файл відстежується в початковому репо. Ви можете змінити його у вашому локальному репо, і git ніколи не позначатиме його як змінений. Детальніше читайте на:


22
Моя любов до git, можливо, подвоїлася.
Марк Фокс

2
Це має бути прийнятою відповіддю. Дякуємо за посилання на це.
Gowiem

4
Чи є спосіб перенести це на віддалений репо?
Брайан Ортіз

2
Хм, я б скоріше позначив файл як "це не git-файл, ніколи не синхронізуйте його з git, навіть у деяких інших репо"
fantastory

11
Ви можете відновити його git update-index --no-assume-unchanged <file>. Якщо ви хочете перерахувати їх git ls-files -v | grep '^h'.
Sanghyun Lee

12

Точна мета ігнорування змін, внесених у файли, дозволяючи їм існувати .gitignore. Тому додавання файлів (або каталогів) .gitignore- це єдине, що вам потрібно зробити.

Але ваша проблема полягає в тому, що git вже відслідковує файли, які ви хочете ігнорувати, і .gitignoreне застосовується до відстежуваних файлів. Єдиний спосіб зупинити це відстеження - сказати git видалити їх. Використовуючи git rm --cached, ви не дозволяєте git видаляти локальні файли, але будь-яке інше сховище, яке отримує ваші зміни, застосує вилучення. Я не думаю, що існує спосіб уникнути цього з власного сховища. Вам потрібно щось зробити на інших сховищах, або прийняти файли будуть видалені.

Щоб запобігти видаленню одного з інших сховищ, ви можете:

  • (очевидно) створити резервну копію файлів десь, витягнути зміни та відновити файли,
  • або також git rm --cachedфайли та виконувати, перш ніж вносити зміни. Git чудово об'єднає два видалення, не торкнувшись уже відібраних файлів.

6
Це не повинно бути правдою ("зупинити відстеження = видалити файл"). Ви все ще можете мати файл відслідковуються в репо і не бачити зміни , зроблені за допомогою: git update-index --assume-unchanged <file>. Подивіться на: blog.pagebakers.nl/2009/01/29/…
ducin

це вирішило мою проблему, тому що мені потрібно видалити файл із висунутого сховища в git, git rm --cached <filename> -r і після цього натискання знову зміниться в сховище, щоб файл був видалений
Vinicius Cardoso

7

Помістіть /у кінці імені каталогу у свій .gitignoreфайл, тобто

tmp/

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

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

Нові файли в цьому каталозі не будуть відстежуватися.

Можливість --cachedпрацювати git rmлише над індексом (очікують зміни більш-менш). Це не впливає ні на робоче дерево, ні на стан відстеженого чи ні.


Я маю це. Обидва the/dir/іthe/dir/*
21312312

Ей Мате, якщо у мене є щось на кшталт / Медіа в різних папках, які я хотів би проігнорувати, чи це можливо? Так як / 1 / Медіа, / 2 / Медіа, аж до 99?
Нік

3

.gitignore не впливає на відстежувані файли.

Те, що ви хочете, - це встановити біт, який не змінюється, для файлів у каталозі tmp / каталог. Тут є гарне пояснення, як це зробити: Git: зніміть файл лише в локальному репо і зберігайте його у віддаленому репо

Крім того, один-лайнери для налаштування припускають-не змінюються для всіх файлів у каталозі - git update-index --assume-незмінний у каталозі .


1

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

Як я розумію, git не може цього зробити. Ви можете відслідковувати файл, чи ні. Якщо ви відстежуєте файл, він існує у віддаленому репо-файлі та змінюється під час внесення змін до нього. Якщо ви не відстежуєте файл, він не існує у віддаленому репо.

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

cp index.php index_template.php
git rm --cached index.php

Тепер відредагуйте index_template.php таким, яким ви хочете, щоб він відображався на віддаленому репо. Додайте щось до свого README, щоб сказати людям, які використовують ваше сховище, що після їх клонування вони повинні скопіювати index_template.php в index.php та відредагувати його відповідно до своїх потреб.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

Коли хтось клонує ваше репо, він повинен створити своє index.php. Ви зробили це легко для них: просто скопіювати index_template.phpв index.phpі переглянути його з настройками комп'ютера специфічними.

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