Введение

Возникла идея сделать свою систему контроля версий. А чтобы всё было по взрослому, то она должна поддерживать систему исключений. Для чего было бы очень полезно использовать синтаксис git, а именно его правила в файлах .gitignore.

Самое очевидное решение - взять данную функцию из исходников git. Проблема в том, что эта функция "прибита гвоздями" к исходникам git. Т.е. нельзя просто взять и вытащить нужную функцию так как это потянет за собой и множество другого кода.

Поэтому решил что сделаю свою реализацию и выложу в открытый доступ. Однако в результате реализации стал замечать, что этот функционал я уже к своему коду "прибиваю гвоздями". Поэтому вместо готового кода решил выложить алгоритм преобразования правила .gitignore в регулярное выражение. Это позволит любому сделать реализацию на нужном ему языке программирования.

Правила замены

Правило состоит из следующих полей[значение по умолчанию]:

  • bool is_not - Отрицание

  • bool is_dir - Правило для директории

  • string re_str - Строка регулярного выражения

**line** - входная строка правила из файла .gitignore

Процесс разбора состоит из трех функций: **parse**, **parse2**, **parse3**.

Функция parse(line)

Функция parse2(line)

Функция parse3(line)

После вызова функции parse(line) переменная line Содержит текст регулярного выражения. После обработки файла .gitignore получаем список правил rules. Для проверки соответствия элемента файловой системы правилу используется функция test(filepath, filename), где:

  • filepath - полное имя файла

  • filename - имя файла относительно директории нахождения файла .gitignore с начальным слешем в начале.

Функция test(filepath, filename)

Если после выполнения функции ret = true значит элемент файловой системы нужно игнорировать.

Для тестирования функционала написал консольную программу для Windows. Вот ссылка на архив на архив. Файл содержит две команды:

* run_git - для генерации отчета со списком игнорирований

* run - для запуска тестов. Команда запускает тесты и выводит результаты в виде

Вывод результатов тестов
Вывод результатов тестов

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

При добавлении новых/изменении существующих тестов необходимо запустить команду run_git (для чего необходимо наличие установленной git).

Комментарии (51)


  1. Stingray42
    30.10.2022 16:59
    +6

    Возникла идея сделать свою систему контроля версий

    Как вообще может возникнуть такая идея?


    1. shasoftX Автор
      30.10.2022 17:04

      А что в этом сложного?

      Само собой это не будет "убийца git", но достаточно просто получить состояние текущего проекта локально и в удаленном хранилище. после чего определить различия и записать эти различия в виде набора команд "добавить"/"удалить" ("изменить"="удалить"+"изменить"). И эту разницу либо записать в хранилище (получаем в хранилище новую версию), либо применить локально (получить состояние как в хранилище).


      1. KvanTTT
        30.10.2022 18:14
        +3

        Интересует мотивация такого решения и причина, почему git не подходит.


        1. shasoftX Автор
          30.10.2022 19:35
          -1

          Для работы с удаленным репозитарием git требуется установить сервер git. А мне его мне ставить некуда. Моя программа будет работать с FTP, что позволит сохранять файлы на HDD подключенный к роутеру. Или сетевой диск. Или в облако какое-то.


          1. KvanTTT
            30.10.2022 19:37

            Не очень понял, вашу программу поставить можно, а гит — не получится?


            1. shasoftX Автор
              30.10.2022 19:39

              Чтобы работать с git, нужно поставить его

              1. Локально

              2. На сервер куда будем сохранять

              Мою программу нужно ставить только локально. Тот же FTP на роутере в наше время весьма распространенная практика.


              1. KvanTTT
                30.10.2022 19:49
                +2

                А, т.е. гит не умеет работать с файлами по ftp?


                1. shasoftX Автор
                  30.10.2022 19:51

                  Я где то писал что я спец по git?


                  1. KvanTTT
                    30.10.2022 21:00
                    +2

                    Не в курсе. Я просто пытаюсь понять проблему и разобраться, нельзя ли ее решить существующими надежными средствами. Кстати, нашел что-то для работы с git под ftp, но не изучал подробно: https://git-ftp.github.io/


                    1. shasoftX Автор
                      30.10.2022 21:14

                      https://habr.com/ru/post/178067/

                      Не особо понял что со скачиванием. Т.е. может ли он по FTP загрузить нужную версию. Есть подозрение, что на FTP просто выгружается текущее состояние файлов. И о скачивании какой-то версии речи не идет. Т.е. судя по примеру: кодим сайт, потом запускаем команду и она выгружает на хостинг новый код.

                      Может кто-то, кто пользуется сможет этот момент прояснить.


                      1. KvanTTT
                        30.10.2022 21:35

                        Только это 9-летняя статья, а за такое время много всего могло измениться.


                      1. shasoftX Автор
                        30.10.2022 21:54

                        Нашел в документации

                        download (EXPERIMENTAL) : Downloads changes from the remote host into your working tree. This feature needs lftp to be installed and does not use any power of Git. WARNING: It can delete local untracked files that are not listed in your .git-ftp-ignore file.

                        Но последний коммит 3 года назад и судя по всему эту функцию до ума так и не довели. Вероятно это делали для деплоя сайтов.

                        Но ни о каких версиях речи нет.

                        Т.е. инструмент писался именно для деплоя сайта. Он в принципе не предназначался для хранения версий файлов на FTP.


              1. fedorro
                30.10.2022 23:26
                +7

                Открою секрет — git не нужно ставить на сервере, можно просто папку .git на сервер закачивать, в том числе через тот же ftp.


                1. shasoftX Автор
                  31.10.2022 06:10
                  -2

                  Так всё равно нужен какой-то функционал чтобы он только обновление закачивал. Да и для скачивания на другую машину тоже нужен функционал чтобы он не скачивал вся заново.


                  1. fedorro
                    31.10.2022 11:05

                    Мне кажется что хорошие ftp-клиенты могут скачивать\закачивать только изменённые файлы в папке .git, на основе даты изменения, например. Но вообще она не такая уж и большая обычно, чтобы было проблемой скачать-закачать её целиком.


                    1. shasoftX Автор
                      31.10.2022 11:36

                      Я использую программу для бэкапа всех своих проектов. И файлов там под 100 тыс. Проверка по FTP 100 тыс. файлов всё-таки займет время.


                      1. fedorro
                        31.10.2022 11:47
                        +1

                        Для бэкапа проекты лучше в архив жать — гораздо быстрее, а FTP- медленный и древний протокол, который потихоньку выпиливают уже ото всюду.


                      1. shasoftX Автор
                        31.10.2022 11:55

                        Если каждую версию в архив жать, то это большой объем. А если только изменения, то неудобно восстанавливать нужную версию.

                        Отсюда и желание сделать свою программу. Я и сейчас своей пользуюсь, и она жмет в архив. Но у неё свой формат игнорирований + в новой версии планирую файлы в хранилище хранить по другому. Каждый файл в отдельном файле с именем хеша. В этом случае если несколько одинаковых файлов, то в хранилище это будет один файл. И при перемещении в другое место сам файл не нужно будет переархивировать.


              1. mayorovp
                31.10.2022 19:25
                +1

                Если вам нужно ставить программу только локально, а удалённо лишь хранить файлы — есть два варианта:


                1. Вообще отказаться от контроля удалённых версий! Обычно на таких удалённых хостах исходникам всё равно делать нечего, им нужны результаты сборки.


                2. Монтируете ваш FTP-сервер как директорию в файловой системе, создаёте в ней новый worktree. Работать будет небыстро, но сомневаюсь что ваша велосипедная система контроля версий принципиально что-то ускорит.


                3. Ах да, третий вариант — берёте обычный git и прикручиваете к нему велосипед для экспорта файлов на FTP-сервер. Будет сложно, но намного проще чем писать свою систему контроля версий.



                1. shasoftX Автор
                  31.10.2022 19:39

                  Мне нужно как раз делать бэкап текущего проекта (т.е. именно исходников) + возможность откатится к нужной версии. На случай если HDD вдруг помрет.


          1. aleksandy
            31.10.2022 12:32
            +1

            Не работает что ли? Или аналитический обзор предметной области делать некогда, надо код писать?


            1. shasoftX Автор
              31.10.2022 12:34
              -2

              Это домашний проект, а не по работе. Так что лучше "код писать".


              1. aleksandy
                31.10.2022 12:41
                +1

                Лучше использовать правильный инструмент, соответствующий задаче. Другой, конечно, вопрос, правда не исключено что и git в задаче не требуется. Но это уже совсем другая история.


                1. shasoftX Автор
                  31.10.2022 12:45

                  C git самое полезное что нашлось, это копировать по FTP папку .git

                  Но это процесс долгий, т.к. у меня 100 тыс. файлов. Т.е. изменился один файл, а копировать нужно всё. Значит всё-равно нужно писать инструмент который будет копировать только изменение. На мой взгляд проще написать сразу "свой git" в версии lite.


                  1. aleksandy
                    31.10.2022 13:12

                    Если изменился один файл, то гит отправит только изменения по этому файлу, откуда 100k файлов взялось? Ну, да, первый пуш будет долгим, но и в "своём гите" инициализацию делать придётся.


                    1. shasoftX Автор
                      31.10.2022 13:16

                      Это если вы на сервер git отправляете изменения. А если копируете папку .git по FTP, то он всё равно все файлы будет перебирать. В лучшем случае сверять дату/размер и такие файлы не копировать заново.


                      1. aleksandy
                        02.11.2022 09:35

                        А за какой надобностью копировать на ftp всю папку .git, кроме первого раза? Есть подозрение, что кто-то не понимает механизма работы git.

                        После копирования проекта на ftp в первый раз нужно добавить его в локальной копии как удалённый репозиторий. И изменения на ftp будут попадать обычным push-ем в удалённый репозиторий.


    1. selivanov_pavel
      30.10.2022 17:30
      +3

      Ну пишут же люди ОС для развлечения, почему бы не написать VCS?


      1. novoselov
        30.10.2022 17:32
        +5

        Можно написать свой язык, на котором написать VCS в которой будут храниться исходники своей ОС, чтобы на ней запускать свой язык и свою VCS ...


        1. selivanov_pavel
          30.10.2022 17:34
          +2

          ... на собственноручно спаянном компьютере с собственноручно разработанной архитектурой.


          1. shasoftX Автор
            30.10.2022 17:53
            +2

            И все это в собственноручно сделанном доме!


            1. selivanov_pavel
              30.10.2022 18:09
              +1

              Подключённом к собственноручно сделанной электростанции. Собственноручно вытянутыми проводами из собственноручно выплавленного металла из собственноручно добытой руды.

              И всё это на собственноручно терраформированной планете, разумеется.


              1. anticyclope
                30.10.2022 18:19
                +2

                упущен момент с тем, что автор должен для начала сам себя сделать. собственноручно.


                1. selivanov_pavel
                  31.10.2022 00:06
                  +1

                  Так он и сделал, с одной клетки начинал.


  1. KvanTTT
    30.10.2022 18:32
    +1

    Как преобразовать правило .gitignore в регулярное выражение

    Интересно, внутри гита тоже происходит такая конвертация или там работает по-другому?


    Возникла идея сделать свою систему контроля версий.

    Топик не о ней, но все же, с какой целью?


    Однако в результате реализации стал замечать, что этот функционал я уже к своему коду "прибиваю гвоздями".

    Что плохого в "прибивании гвоздями", если решается конкретная задача?


    Функция parse3(line)

    Не используйте несколько риплейсов на одной и той же строке. Эффективней сделать один билдер и таблицу подстановок. Есть и другие моменты, которые можно улучшить.


    Для тестирования функционала написал консольную программу для Windows. Вот ссылка на архив на архив.

    Полезней была бы ссылка на исходники на каком-нибудь гитхабе. А почему консольная программа только под Windows? Если нет GUI, то программа должна быть довольно просто портируемой или вообще бесплатно. Ну и архив этот у меня не скачивается.


    1. shasoftX Автор
      30.10.2022 20:30
      -1

      Что плохого в "прибивании гвоздями", если решается конкретная задача?

      Для меня - ничем. Но если кто-то захочет использовать, то ему придется кучу моего кода себе вставлять. Точно также как и мне, если бы я из git вытащил этот функционал.

      Не используйте несколько риплейсов на одной и той же строке. Эффективней сделать один билдер и таблицу подстановок. Есть и другие моменты, которые можно улучшить.

      Это всё-таки общий алгоритм, а не конкретная реализация. В коде можно и таблицу подстановок реализовать. К тому же функция разбора правила всё-таки вызывается не так часто, так что экономить "на спичках", на мой взгляд, тут не имеет смысла. Разве что это окажется "узким местом".

      Полезней была бы ссылка на исходники на каком-нибудь гитхабе. 

      Для этого придется выкладывать ещё кучу других либ. Вытаскивать нужные - лень. А выкладывать всё, так многие сейчас в процессе переработки в связи с написание VCS и поэтому работаю криво. И есть сторонние зависимости (тот же zlib), которые тоже нужно будет скачивать. Вряд ли много народу вообще такое будут делать, поэтому пока не стал выкладывать

      А почему консольная программа только под Windows?

      Потому что основная система у меня windows

      Ну и архив этот у меня не скачивается.

      На сайте у меня не прикручен https, вот браузер и блокирует :(

      В ближайшее время постараюсь прикрутить


  1. namtyda
    30.10.2022 20:19

    Я бы не делал блок-схемы в статьях. Это ужасно непонятно


    1. shasoftX Автор
      30.10.2022 20:36
      -1

      А что понятнее, код? По мне так ещё более непонятен


      1. KvanTTT
        30.10.2022 21:11
        +3

        Если это псевдокод или код на современном ЯП (C#, Kotlin, Swift, Python), то более понятен и компактен. Программисты чаще читают код, чем схемы. Немаловажно, что его еще и скопировать можно.


        1. shasoftX Автор
          30.10.2022 21:21
          -1

          В данном случае на блок-схеме именно псевдокод, без привязки к языку. Скопировать код сможет только тот программист, кто на этом языке пишет. А написать код по блок-схеме сможет любой программист.


          1. mayorovp
            31.10.2022 19:37

            Перевести код с одного обычного (не ml-подобного) языка на другой тоже может (почти) любой программист. Это гораздо проще чем читать блок-схему.


            1. shasoftX Автор
              31.10.2022 19:40

              по моему мнению это очень странный программист, которому переводить код проще чем блок схему читать. Чтение блок схем это основа.


              1. mayorovp
                31.10.2022 20:03
                +3

                Чтение кода — это то чем я занимаюсь каждый день. Чтение блок-схем — это то, чем я занимался последний раз 11 лет назад. Как думаете, какой навык лучше развит? Это первое.


                А второе — плотность информации. У кода она выше, проще на один экран вместить. Ваши схемы, к примеру, занимают у меня 2 с половиной экрана в сумме, скролить их — не перескролить...


  1. LeshaRB
    30.10.2022 22:42
    +1

    Так это скорее будет не GIT, а SVN


    1. shasoftX Автор
      31.10.2022 06:10

      Это скорее бэкап с версиями, чем git


  1. Pest85
    31.10.2022 06:21

    1. shasoftX Автор
      31.10.2022 12:49

      1. Pest85
        31.10.2022 16:17

        Working directly from the USB stick has several problems to it.

        Гугл транслейт в помощь.


        1. shasoftX Автор
          31.10.2022 16:24

          Как я понял, это только в режиме бэкапа работает. Но и тут уже предлагали папку .git копировать на FTP.


          1. Pest85
            01.11.2022 04:50

            Это работает в качестве основной репозитории. Просто вместо того чтобы поднимать сервер, используеться флешка которую можно взять с собой и использовать в другом устройстве когда нужно.
            Без танцев с бубном.
            А в облаке полно git as a service, многие из них бесплатные, покрывающие почти все "домашние" проекты.


  1. Pest85
    01.11.2022 04:52
    +1

    > Но это процесс долгий, т.к. у меня 100 тыс. файлов.

    > The Linux kernel source tree is up to 62,296 files

    Я так понимаю вы решили переплюнуть Линуса Торвальдса, создателя git и linux?
    И свой контроль версий придумали, и проект на 100 тыс файлов...