Я не думаю, що фіксація Git може записати намір, наприклад "припинити відстежувати цей файл, але не видаляти його".
Якщо ввести такий намір, зажадає втручання поза Git в будь-які сховища, які об'єднують (або перезавантажують) комісію, яка видаляє файл.
Збережіть копію, застосуйте видалення, відновлення
Напевно, найпростіше зробити це сказати своїм нижчим користувачам зберегти копію файлу, витягнути видалення та відновити файл. Якщо вони перетягуються через ребазу та вносять зміни до файлу, у них виникнуть конфлікти. Щоб вирішити такі конфлікти, використовуйте git rm foo.conf && git rebase --continue
(якщо суперечлива комісія має зміни, крім змін у вилученому файлі), або git rebase --skip
(якщо суперечлива фіксація змінилася лише на видалений файл).
Відновіть файл як невиправлений після витягування комітету, який його видаляє
Якщо вони вже зняли вашу команду видалення, вони все одно можуть відновити попередню версію файлу за допомогою git show :
git show @{1}:foo.conf >foo.conf
Або з git checkout (за коментарем Вільяма Перселя; але не забудьте знову видалити його з індексу!):
git checkout @{1} -- foo.conf && git rm --cached foo.conf
Якщо вони виконали інші дії з моменту вилучення вашого видалення (або вони перетягуються з базою даних у відокремлену HEAD), їм може знадобитися щось інше, ніж @{1}
. Їх можна було git log -g
б знайти, перш ніж вони видалили ваше видалення.
У коментарі ви згадуєте, що файл, який ви хочете "відстежувати, але зберігати", - це якийсь файл конфігурації, необхідний для запуску програмного забезпечення (безпосередньо з сховища).
Зберігайте файл як "за замовчуванням" і вручну / автоматично його активуйте
Якщо продовжувати зберігати вміст файлу конфігурації у сховищі не зовсім неприйнятно, можливо, ви зможете перейменувати відстежений файл з (наприклад) foo.conf
на, foo.conf.default
а потім доручити вашим користувачам cp foo.conf.default foo.conf
після застосування перейменування. Або якщо користувачі вже використовують деяку існуючу частину репозиторію (наприклад, скрипт або якусь іншу програму, налаштовану вмістом у сховищі (наприклад, Makefile
чи подібне)) для запуску / розгортання вашого програмного забезпечення, ви можете включити механізм дефолту в запуск / процес розгортання:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
За наявності такого механізму дефолту користувачі повинні мати можливість взяти на себе зобов’язання, яке перейменовано foo.conf
наfoo.conf.default
без необхідності робити будь - які додаткові роботи. Крім того, вам не доведеться копіювати файл конфігурації вручну, якщо ви зробите додаткові установки / сховища в майбутньому.
Переписування історії вимагає ручного втручання в будь-якому випадку ...
Якщо неприпустимо підтримувати вміст у сховищі, ви, ймовірно, захочете повністю викорінити його з історії чимось подібним git filter-branch --index-filter …
. Це означає історію перезапису, що вимагатиме вручну втручання для кожної гілки / сховища (див. Розділ «Відновлення з upstream Rebase» на сторінці сторінки git rebase ). Спеціальна обробка, потрібна для вашого конфігураційного файлу, - це ще один крок, який потрібно виконати під час відновлення з перезапису:
- Збережіть копію файлу конфігурації.
- Відновлення після перезапису.
- Відновіть файл конфігурації.
Ігноруйте це, щоб запобігти рецидиву
Який би метод ви не використовували, ви, ймовірно, захочете включити ім’я файлу конфігурації у .gitignore
файл у сховищі, щоб ніхто не міг ненароком git add foo.conf
знову (це можливо, але вимагає -f
/ --force
). Якщо у вас є декілька файлів конфігурації, ви можете розглянути можливість "переміщення" їх усіх в єдиний каталог і ігнорування всього цього (маючи на увазі "переміщення", я маю на увазі зміну там, де програма розраховує знайти свої конфігураційні файли, та отримати користувачів (або механізм запуску / розгортання) для копіювання / переміщення файлів на їх нове місце; ви, очевидно, не хочете збирати файл mv у каталог, який ви будете ігнорувати).