Страницы

Поиск по вопросам

суббота, 15 февраля 2020 г.

Заморозить часть строки в git'е

#git #npm #gitignore


Есть npm'овский packadge.json, один из модулей в котором подключается как git-репозиторий
с тегом. Проблема в том, что адрес репозитория должен содержать имя пользователя:

"some-module": "git+https://qwertiy@git.smth.com/some-module.git#1.2.3"
                            ^^^^^^^_______________________________________ у каждого своё
                                                                 ^^^^^____ версия
меняется


Можно ли как-то настроить git, чтобы он при выполнении pull, commit, rebase и других
команд игнорировал имя пользователя, но обновлял версию пакета без merge-конфликтов?

Т. е. везде имя должно оставаться без изменений: локально - локальное имя, а в закоммиченном
- закоммиченное.

А может быть есть какие-то другие способы, связанные не с git'ом, а с npm'ом?
    


Ответы

Ответ 1



Да, это можно настроить в git. Называется smudge /clean (загрязнить-почистить). Суть в том, что при добавлении файла или извлечении с репозитория он будет пропускаться через фильтр. Итого, нужно будет два фильтра - один будет подставлять правильного пользователя, второй - заменять его на некого "универсально", которого будем оставлять в коде. Здесь расписано детально, как это работает https://alexzaytsev.me/2014/10/19/git-filter-to-convert-spaces-to-tabs-and-vice-versa/ - но тут для пробелов. Вначале в .gitconfig (или .git\info\attributes) добавить фильтр package.json filter=hide_my_name и добавить собственно сами фильтра в gitconfig [filter "hide_my_name"] clean = 'remove-name' smudge = 'restore-name' remove-name и restore-name - это две программы (или скрипта), которые на вход получат содержимое файла на стандартный ввод и должны будут сделать замену. clean задача будет запускаться перед git add, а smugle - после checkout. Написание самых скриптов и как хранить имя для конкретного пользователя - это уже домашняя задача. Но я не исключаю, что эта задача может иметь такое решение: [filter "hide_my_name"] clean = 'perl -pe "s!git+https://qwertiy@!git+https://XXXXXXX@!"' smudge = 'perl -pe "s!git+https://XXXXXXX@!git+https://qwertiy@!"'

Комментариев нет:

Отправить комментарий