git (сложный) файл преобразования при коммите - PullRequest
2 голосов
/ 24 марта 2020

У меня есть несколько файлов в формате (назовем их * .db файлами), которые нельзя правильно разложить / объединить с помощью git. Тем не менее, можно преобразовать каждый из этих файлов в файловую структуру, которую git может обработать правильно - для каждого из файлов базы данных мы можем сгенерировать дерево каталогов так, чтобы каждый файл в этом дереве был обычным текстовым файлом, который может быть диффузия / слияние git (назовем этот процесс «деконструкция»). Кроме того, содержимое этого дерева каталогов можно объединить, чтобы (заново) создать исходный файл БД. Такой подход позволяет нам использовать стандартный git хостинг со всеми обычными рабочими процессами (pull-запросы, auto-merge et c.) С этими специальными файлами.

Теперь к актуальной проблеме: я хотел бы сделать все это полностью прозрачным для пользователя. То есть каждый раз, когда пользователь запускает файл БД, я хочу, чтобы скрипт 'deconstruct' автоматически запускал преобразованное представление, ставя его в очередь. Точно так же, каждый раз, когда запускается операция извлечения, я хочу, чтобы выполнялся скрипт «construct», чтобы пользователь получал правильный файл БД. Это также должно работать с git add -a et c. Я хочу, чтобы все это происходило на стороне клиента, так как я не могу изменить удаленную конфигурацию (поэтому о пользовательских инструментах слияния также не может быть и речи).

Это нормально, если на удаленном устройстве данные отображаются в деконструированном сформироваться. Фактически, в идеале я хотел бы видеть что-то вроде

data.db/
  1.txt
  2.txt
  ....
  n.txt

на пульте для файла data.db в локальном хранилище - но я не знаю, возможно ли это вообще. Это будет означать, что local git сможет создать эту деконструированную форму в поэтапной области (и зафиксировать это) + реконструировать ее в файл базы данных, без того, чтобы деконструированная форма никогда не касалась реального рабочего каталога.

Я предполагаю, что по крайней мере некоторые аспекты из вышеперечисленного будут работать (в противном случае, как это делают инструменты типа git -lfs?), Но я не знаю, каковы ограничения и с чего начать. Я знаю о предварительной фиксации et c. хуки, но я не думаю, что они позволяют мне напрямую манипулировать областью подготовки.

Буду признателен, если кто-нибудь нарисует план атаки о том, как выполнить sh этот рабочий процесс.

1 Ответ

3 голосов
/ 24 марта 2020

Обратите внимание на фильтры содержимого:

см. Главу «Атрибуты» в книге Pro Git, прокрутите вниз до раздела фильтр содержимого .

Я узнал об их существовании, прочитав один из ответов Von C на (гораздо более простой) вопрос содержания.

Если бы вы go задали вопрос только в главе, посвященной атрибутам, также есть пример того, как обрабатывать двоичные файлы перед диффузией .


Чтение git help gitattributes и просмотр деталей раздела filter :
при определении фильтра вы можете использовать %f для передачи пути к файлу в качестве аргумента скрипту обработки.

Вы можете использовать это для:

  • on clean:

    • построить целевой путь из исходного имени файла, например: расширенные данные для файла foo.db будут фактически храниться в каталоге с именем .foo.db.d/,

    • заставить скрипт построить расширенное содержимое и поставить его на место,

    • заменить c о самом фактическом подготовленном файле foo.db с путем расширенных данных .foo.db.d
  • в smudge:

    • читать путь к расширенному содержимому из файла foo.db
    • объединить расширенное содержимое в один foo.db файл
    • каким-либо образом не извлекать каталог .foo.db.d (не уверен как реализовать эту часть еще)

Все еще в git help attributes:

Также есть способ определить команду filter.<name>.process ( вместо двух .clean и .smudge команд), которые позволяют вам углубиться в то, что git "видит" как контент.

Если вы хотите пробежать по этой кроличьей норе: в Ubuntu мне пришлось установите пакет git-doc, чтобы получить доступ к подробной документации, указанной на странице help: technical/long-running-process.txt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...