Як зупинити Git відстежувати будь-які зміни у файлі з цього вперед коміту?


79

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

Я хотів би, щоб майбутні витяжки сховища Git включали версію за замовчуванням, але не враховували будь-які зміни, внесені будь-яким користувачем.

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

cat "app/dir/config.file" >> .gitignore
git rm --cached app/dir/config.file

Далі виконує роботу, але не зберігається після натискання на репо.

git update-index --assume-unchanged app/dir/config.file

Це здається загальною вимогою до контролю версій навколо конфіденційної інформації, але я, здається, не можу знайти рішення.


3
Зазвичай я створюю a, config.file.distщо містить значення конфігурації за замовчуванням, і фіксую це. Потім, коли копію виписують, ви просто копіюєте .distфайл, щоб створити власне конфігураційний файл і заповніть значення, які ви хочете змінити.
Павло,

1
Здається, це загальний консенсус. Якщо ви не хочете, щоб він був версіями, не відстежуйте його для початку або відстежуйте шаблон, який реалізує користувач. Я починаю думати, що намагаюся забити гвинт неправильно.
Бен Кемпбелл,


Відповіді:


177

Як зазвичай, github має чудові документи на це.

https://help.github.com/articles/ignoring-files#ignoring-versioned-files

Ось відповідний фрагмент:

Ігнорування версійних файлів

Деякі файли у сховищі часто змінюються, але рідко фіксуються. Зазвичай це різні локальні файли конфігурації, які редагуються, але ніколи не повинні бути записані вище. Git дозволяє вам ігнорувати ці файли, припускаючи, що вони не змінилися.

  1. У Терміналі перейдіть до розташування вашого сховища Git.
  2. Запустіть у своєму терміналі таку команду:

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

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

Щоб Git знову відстежував файл, просто запустіть:

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


55
Перша відповідь на це запитання вказує на те, що --assume-unchangedзадає локальний параметр. Це означає, що --assume-unchangedщоразу, коли новий розробник клонує, вони потребують кожного відповідного файлу. Як можна пропагувати таку поведінку?
Едвард Ньюелл,

12
Я радий, що ви процитували цей розділ, оскільки GitHub з тих пір видалив його з цієї сторінки.
Джастін

Розташування в документах: git-scm.com/docs/…
mtpultz

@EdwardNewell За протоколом. Включіть відповідні файли у файл із назвою .git-assume-unchanged(або щось інше). Тоді в будь-якій команді, яку ви використовуєте для налаштування конфігурацій вашого проекту, запустіть cat .git-assume-unchanged | xargs git update-index --assume-unchanged. Можливо, найкраще також включити псевдоніми для встановлення та зняття їх у конфігурації проекту.
DylanYoung

7

Не впевнений, що це "найкращий" спосіб ... але те, що, як я виявив, працює, займає кілька кроків.

Приклад нового Laravel:

  1. git init
  2. Налаштуйте .gitignoreфайли для бажаних результатів, наприклад, не втрачаючи папки постачальників.
  3. Створіть копію файлів, які ви не хочете відстежувати (наприклад: .htaccess, .env тощо)
  4. git add .
  5. git commit -m "first commit"
  6. git rm --cached public /.htaccess тоді git rm --cached .env
  7. git commit
  8. git status повинні показувати ці файли як видалені.
  9. Тепер поверніть скопійований файл назад. Оскільки вони збігаються з тим, що ви наказали git видалити з відстеження, git тепер повністю ігноруватиме ці файли.

Тепер їх можна редагувати, і ви можете мати локальну та виробничу версії. ПРИМІТКА. Можливо, вам доведеться повторити всі ці кроки в перший раз під час налаштування виробництва. Поки що це добре спрацювало для мене.

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