Зберігайте файл у Git repo, але не відслідковуйте зміни


305

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

Наприклад, я розгортаю нову установку цієї рамки для нового клієнта, я хочу завантажувати такі файли (вони мають значення за замовчуванням CHANGEME) і мені просто потрібно внести зміни, характерні для цього клієнта (облікові дані бази даних, інформація про адресу електронної пошти, користувацький CSS).

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css

В даний час, якщо я бігаю

git clone git@github.com:user123/myRepo.git httpdocs

а потім відредагуйте файли вище, все чудово. Поки я не випущу виправлення чи виправлення та запустіть git pull. Усі мої зміни потім перезаписуються.





Ви можете просто проігнорувати файли облікових даних / конфігурації клієнта і мати програму побудувати файли за замовчуванням, якщо вони відсутні під час встановлення репо?
MatthewG

Відповіді:


618

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

git update-index --assume-unchanged FILE_NAME

і якщо ви хочете знову відстежувати зміни, використовуйте цю команду:

git update-index --no-assume-unchanged FILE_NAME

документація на git-update-index


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

7
Так, це має бути "Прийнятий відповідь". Працювали для мене.
joshmcode

34
Як вважає Хуніо Хамано (супровідник Git): "Припустимо, що без змін не слід зловживати механізмом ігнорування. [...] Git не обіцяє, що Git завжди вважатиме, що ці шляхи будуть незміненими --- якщо Git можна визначити шлях, який позначений як припущен-не змінений, змінився без втрати додаткової вартості lstat (2), він залишає за собою право повідомляти, що шлях був змінений (у результаті "git commit -a" може вільно здійснити це зміни). " Іншими словами, припущення без змін - лише для місцевих питань ефективності. Якщо Git зможе визначити, що ці файли змінилися легшим способом, це станеться.
Алехандро Гарсія Іглесіас

41
Читаючи інформацію для неї, я думаю, що --skip-worktreeваріант краще підходить для цієї роботи, ніж --assume-unchanged.
PJSCopeland

26
--skip-worktree - це справді кращий варіант. Більше інформації: stackoverflow.com/questions/13630849/…
Customizer

80

Щоб витягнути відповідь із коментарів іншої відповіді:

$ git update-index --skip-worktree FILENAME

Краще варіант, ніж це --assume-unchanged

Більше про це можна прочитати тут: Git - Різниця між "припустити-незмінним" та "пропустити робоче дерево"



Коли я це роблю, а потім намагаюся змінити гілки, я отримую "Наступні незавершені файли робочого дерева будуть перезаписані під замовлення ... Будь ласка, перемістіть або видаліть їх, перш ніж перемикати гілки". Будь-які ідеї, як уникнути?
Патрік Шалапський

Стаття, на яку посилається @aexl, перейшла до компільованого
Ендрю Кітон

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

58

Для моїх проектів Code Igniter я зберігаю database.php.example та config.php.example в репо.

Потім я додаю config.php та програми / config / database.php у файл .gitignore .

Отже, нарешті, коли я розгортаюсь, я можу скопіювати .example файли (для config.php та database.php), налаштувати їх, і вони не будуть відслідковуватися GIT.


12
Гарне рішення, але я вважаю, що відповідь насірхана найкраща.
словазрештою

Це не гарне рішення. Якщо ви змиєте свій індекс git, ви почнете відслідковувати зміни, коли цього не хочете. Дивіться у відповіді @nasirkhans правильний спосіб зробити це.
Брайан Мелтон-Грейс - MSFT

3
Я не згоден з обома попередніми коментарями. Таким чином набагато простіше оновити значення "за замовчуванням" без необхідності їх оформити та скопіювати локальну конфігурацію в іншому місці, щоб просто повернути їх після. Крім того, він застосовується до всіх сховищ, тому вам не доведеться робити повторні зміни.
OskarD90

1
якщо він знаходиться в gitignore, чому б він знову почав відстежувати зміни
Shapeshifter

Вирішує проблему ОП, але насправді не відповідає на питання.
Тревіс Вілсон

1

Я б поклав їх у свій .gitignoreфайл і просто скопіював їх вручну за потребою.

Отже, ім'я файлу скелета було б у git, ігноровані назви файлів не були б у git (але були б у .gitignore). Таким чином, коли буде зроблено ручний крок, щоб скопіювати їх у "фактичний" з "шаблону" (краще ім'я, ніж скелет), вони негайно ігноруються.


1
немає способу спочатку додати їх до репо, а потім додати їх до .gitignore? Було б чудово, якби для цього було рішення включити файли, але не будь-які зміни після певної фіксації чи чогось іншого.
Горлатив

1
@mklauber Я хочу тримати їх нескінченно, поки я не забігаю git rm <file>. Мета - IE: файл config.php. Я хочу зберегти конфігураційний файл, але я, очевидно, не хочу відслідковувати облікові дані бази даних від клієнта до клієнта, оскільки вони різні.
Горлатива

1
Так, у мене проблема з нашим файлом rails database.yml. Ми тримаємо каркас, а потім копіюємо та змінюємо його.
Майкл Дюррант

якби я створив ці конфігураційні файли "Скелет", ви додасте їх до початкового комітету а потім змінити .gitignore, щоб ігнорувати файл? Насправді зберігання файлу в репо, але як скелет?
горілатива

10
Ви маєте ці два варіанти: додайте файл git add file1і відредагуйте .gitignoreфайл. Зафіксований файл залишиться там і не оновлюватиметься. Або: Ви можете додати файл, .gitignoreа потім додати його, git add --force file1щоб примусити файл. Ви можете використовувати 2-й варіант, коли вам доведеться перезаписати файл
klaustopher

1

Надані відповіді вирішують проблему лише частково, але вносять ще більше проблем.

Мені потрібно було зберегти файл "Web.Local.config". Єдине рішення, яке працювало для мене:

1. Виключіть файл із проекту

2. Створіть окрему копію файлу як Web.LocalTemplate.config

Тепер, коли "Web.LocalTemplate.config" відстежується Git, усі розробники можуть використовувати його як вихідну точку. Однак "Web.Local.config", не будучи частиною проекту, автоматично ігнорується.


Як git update-index --skip-worktree FILENAMEтільки вирішити вашу проблему частково, або навіть додати більше проблем ?? Це вирішує саме те, що ви намагаєтеся зробити. Ви пробували?
Амір Асіраф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.