У попередній статті ми обговорили, як змусити Git ігнорувати локальні зміни у файлах, які вже відстежуються. Але що робити, коли потрібно отримати оновлення з віддаленої гілки? Щоб не вводити щоразу купу команд, процес можна автоматизувати двома способами: за допомогою Bash-скрипта або Git-псевдоніма (alias).
1. Bash-скрипт
Найпростіший підхід — винести всі потрібні команди у bash-скрипт. Створіть файл, наприклад, ignore-local-changes.sh
, з таким кодом:
#!/bin/bash
FILE="$1"
# Перестати ігнорувати файл (якщо раніше був увімкнений assume-unchanged)
git update-index --no-assume-unchanged "$FILE"
# Сховати локальні зміни для цього файлу в стеш
git stash push -k "$FILE"
# Оновити локальну гілку з віддаленого репозиторію
git pull
# Застосувати приховані зміни
git stash pop
# Знову сказати Git ігнорувати зміни в файлі
git update-index --assume-unchanged "$FILE"
Потім зробіть файл виконуваним:
chmod +x ignore-local-changes.sh
Тепер у будь-якому вашому проєкті, коли потрібно оновити репозиторій, але залишити локальні зміни в певному файлі, запустіть:
./ignore-local-changes.sh path/to/your/file.ext
Що відбувається всередині скрипта:
- Знімається прапорець
assume-unchanged
, якщо він був встановлений. - Зміни файлу поміщаються в стеш (stash), щоб вони не заважали
git pull
. - Здійснюється
git pull
для отримання свіжих змін із віддаленого репозиторію. - Повертаються (pop) змінені дані з вашого стеша — тобто ваші локальні правки зміни застосовуються до оновленої версії файлу.
- Активується режим
assume-unchanged
для файлу, аби надалі Git не зважав на локальні зміни.
2. Git-псевдонім (alias)
Другий спосіб — оформити описаний вище ланцюжок як Git-псевдонім, щоб взагалі не зберігати окремий скрипт. Для цього відкрийте (або створіть) файл ~/.gitconfig
і додайте до нього:
[alias]
ignore-update = "!f() { \
FILE=\"$1\"; \
git update-index --no-assume-unchanged \"$FILE\" && \
git stash push -k \"$FILE\" && \
git pull && \
git stash pop && \
git update-index --assume-unchanged \"$FILE\"; \
}; f"
Зверніть увагу на синтаксис
!f() { ... }; f
. Це спосіб оголосити й одразу викликати анонімну функцію в командному рядку.
Тепер замість запуску Bash-скрипта можна використовувати псевдонім з будь-якого Git-репозиторію:
git ignore-update path/to/your/file.ext
Так Git послідовно виконає:
git update-index --no-assume-unchanged
git stash push
git pull
git stash pop
git update-index --assume-unchanged
У результаті ваш файл збереже локальні зміни й одночасно отримає оновлення з віддаленого репозиторію, залишаючись “невидимим” для подальших комітів.
Висновок:
За допомогою Bash-скрипта або Git-псевдоніма можна спростити роботу з локальними змінами у відстежуваних файлах. Обидва підходи позбавляють вас необхідності вручну вводити щоразу цілий набір команд. Оберіть зручніший для себе варіант — або налаштуйте обидва, якщо у вас різні сценарії використання.
Якщо ви ще не ознайомилися з тим, як взагалі змусити Git ігнорувати локальні зміни в уже відстежуваних файлах, раджу почати з цієї статті, а потім повертатися до автоматизації.
Тепер ви володієте всіма необхідними інструментами, щоб керувати локальними змінами у відстежуваних файлах максимально зручно. Успіхів з проєктами!