Назад

January 6, 2025

🤖 Як автоматизувати процес ігнорування локальних змін в Git за допомогою Bash-скрипта та Git-псевдоніма

У попередній статті ми обговорили, як змусити 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 ігнорувати локальні зміни в уже відстежуваних файлах, раджу почати з цієї статті, а потім повертатися до автоматизації.

Тепер ви володієте всіма необхідними інструментами, щоб керувати локальними змінами у відстежуваних файлах максимально зручно. Успіхів з проєктами!