Обсуждение статьи "Переходим на MQL5 Algo Forge (Часть 2): Работа с несколькими репозиториями"

 

Опубликована статья Переходим на MQL5 Algo Forge (Часть 2): Работа с несколькими репозиториями:

Рассмотрим один из возможных подходов к организации хранения исходного кода проекта в публичном репозитории. Используя распределение по различным веткам, создадим удобные и понятные правила для развития проекта.

В первой статье мы начали переход от использования MQL5 Storage — встроенного SVN-хранилища в MetaEditor — к более гибкому и современному решению на основе системы контроля версий Git — MQL5 Algo Forge. Основной причиной такого шага стало желание полноценно использовать разные ветки репозитория в процессе работы над разными проектами или функциональностью в рамках одного проекта.

Переход начался с создания нового репозитория в MQL5 Algo Forge и настройки локальной среды разработки с использованием Visual Studio Code, соответствующих расширений для работы с MQL5 и Git, а также установки необходимых инструментов. После этого в созданном репозитории мы добавили файл .gitignore для исключения из отслеживания стандартных и временных файлов. Все текущие проекты были загружены в отдельную ветку archive, которой была отведена роль архивного хранилища всего существующего кода. Основная ветка main была оставлена пустой и подготовлена для организации новых проектных веток. Таким образом, были заложены все необходимые основы для дальнейшего распределения кода разных проектов по разным веткам репозитория.

Автор: Yuriy Bykov

 

https://www.mql5.com/ru/articles/17698

Перед слиянием мы ещё раз можем визуально просмотреть все изменения в удобном интерфейсе хранилища MQL5 Algo Forge. При такой целенаправленной проверке порой удаётся заметить вещи, которые ускользнули при коммитах: лишние комментарии, случайно добавленные файлы, неоптимальные изменения. По сути, это некоторая форма самодисциплины. К тому же привыкание к правильным процессам вырабатывает привычку работать именно таким образом (создание отдельной ветки, код-ревью, ...).

Дайте угадаю, почему автор не продемонстрировал "просмотр изменений в удобном интерфейсе хранилища MQL5 Algo Forge". Потому, что автор не может этого сделать, так как diff не работает. diff не работает потмоу, что Git считает файлы с исходным кодом бинарными. Это видно даже на скриншоте со статьи:


Примитивная попытка спрятать проблему от читателей. Пролечили бы уже пару файлов для скриншотов что-ли
 

https://www.mql5.com/ru/articles/17698

На этом процесс слияния завершён: ветка article-17698-forge2 влита в ветку develop и удалена:

Она удалена только с сервера, но не из MetaEditor (локального репозитория). Либо автор случайно остановился на самом интересном месте, либо это еще одна проблема, о которой предпочли умолчать.

[edit] Это все равно, что писать статью о спорткаре, в который забыли добавить тормоза. Описать как чудесно он едет 300 км/час, но умолчать о том, что остановка возможна только если впечататься в какую-нибудь стену или хорошее дерево.
 
Vladislav Boyko #:

Дайте угадаю, почему автор не продемонстрировал "просмотр изменений в удобном интерфейсе хранилища MQL5 Algo Forge". Потому, что автор не может этого сделать, так как diff не работает. diff не работает потмоу, что Git считает файлы с исходным кодом бинарными. Это видно даже на скриншоте со статьи:

Примитивная попытка спрятать проблему от читателей. Пролечили бы уже пару файлов для скриншотов что-ли

Всё сразу успеть не получается, к сожалению. Это не попытка спрятать проблему. Был почти уверен, что это можно легко починить, поэтому не стал акцентировать на этом внимание. Сейчас провёл эксперимент - конвертировал один файл репозитория в UTF-8. В ME он открывается и компилируется без каких-либо отличий от того времени, когда он был в UTF-16 LE. В веб-интерфейсе теперь можно нормально посмотреть отличия. В общем, это не Git считает файлы с исходным кодом бинарными, а больше похоже на то, что веб-интерфейс на основе Forgejo не рассчитан на обработку текстовых файлов в кодировке UTF-16 LE, которую использовал MetaEditor по-умолчанию.

А вот diff в MetaEditor... Ему, видимо, только UTF-16 LE подавать можно - русские буквы файла в UTF-8 не отображаются корректно и весь файл считается изменённым из-за различий в конце всех строк:

В процессе написания статьи не пользовался diff в ME, так как... да просто отвык им пользоваться за то время, пока в ME добавлялась поддержка Git и приходилось держать параллельно запущенный VS Code для всех операций с репозиторием. Поэтому и не попало это в статью.

Я не зря пытаюсь предложить альтернативные способы, так как пока проблемы в ME по работе с репозиториями остаются. Но в то же время хочется верить, что они тоже будут со временем устранены. А пока - используем то, что есть.

 
Vladislav Boyko #:

Она удалена только с сервера, но не из MetaEditor (локального репозитория). Либо автор случайно остановился на самом интересном месте, либо это еще одна проблема, о которой предпочли умолчать.

Спасибо за замечание. Действительно, при удалении ветки из удаленного репозитория она и не должна автоматически удаляться из всех клонов этого репозитория на локальных компьютерах. В локальных репозиториях её надо удалить отдельно. Это так во всех хранилищах на основе Git, так что это не проблема Algo Forge. 

[edit] Это все равно, что писать статью о спорткаре, в который забыли добавить тормоза. Описать как чудесно он едет 300 км/час, но умолчать о том, что остановка возможна только если впечататься в какую-нибудь стену или хорошее дерево.

Вот уж точно! Драйв необыкновенный ) Хотя, честно говоря, предпочёл бы не спотыкаться так на каждом повороте. Хорошо, что едет. А где его тормозов не хватает, будем стараться использовать внешние тормоза.

 
Будем исправлять шаг за шагом, включая работу в редакторе
 
Yuriy Bykov #:
В общем, это не Git считает файлы с исходным кодом бинарными, а больше похоже на то, что веб-интерфейс на основе Forgejo не рассчитан на обработку текстовых файлов в кодировке UTF-16 LE, которую использовал MetaEditor по-умолчанию.

Нет, сам Git считает бинарными файлы с кодировкой, в которой их иногда сохраняет MetaEditor. Ни forgejo, ни его веб интерфейс здесь ни при чем. Доказательство на вашем репозитории в Git Bash for Windows:

 
Vladislav Boyko #:

Нет, сам Git считает бинарными файлы с кодировкой, в которой их иногда сохраняет MetaEditor. Ни forgejo, ни его веб интерфейс здесь ни при чем. Доказательство на вашем репозитории в Git Bash for Windows:

Тем не менее, несмотря на это VS Code даже в кодировке UTF-16 LE спокойно показывает все различия. Ну а сам Git называет их бинарными.

 Главное мы выяснили, что после конвертации в UTF-8 проблема решается в консоли Git и в веб-интерфейсе (но при этом возникает другая проблема в Diff ME):


 
Vladislav Boyko #:

Нет, сам Git считает бинарными файлы с кодировкой, в которой их иногда сохраняет MetaEditor. Ни forgejo, ни его веб интерфейс здесь ни при чем. Доказательство на вашем репозитории в Git Bash for Windows:

Проморочивши несколько дней голову, мне в свое время удалось найти способ хотябы залистить список "сломанных" файлов. Способ основан на том, что команда

git ls-files --format='%(eolinfo:index) %(path)'

отображает для них "-text":


Но та команда смотрит только в index (modified и untracked файлы игнорируются). Я не стал разбираться с особенностями eolinfo и решил втупую добавить все файлы в index нового репозитория. В итоге я навайбкодил себе приблуду, которая позволяет проверить наличие "сломанных" файлов до того, как они будут закомичены: https://forge.mql5.io/boyvlad/mql-check-binary-surprises

Логика использования: прежде чем делать коммит, скопировать все файлы проекта (кроме .git папки и gitignore файла) в отдельную папку и запустить в ней скрипт (ссылку на который я дал выше). Скрипт выведет список сломанных файлов, предварительно инициализировав новый git репозиторий и добавив все файлы в index. Скрипт предварительно убедится, что .git папки и gitignore файлов нет - защита от случайного запуска в рабочем каталоге вместо его копии.

Пример использования:

 
Renat Fatkhullin #:
Будем исправлять шаг за шагом, включая работу в редакторе

Предлагаю вам в процессе улучшения попробовать выполнить пару итераций какой-нибудь примитивной branching strategy используя только MetaEditor и веб интерфейс.

  1. Создали ветку next, сделали туда пару коммитов
  2. Влили next в main, удалили next
  3. Создали next еще раз с новым parent commit, сделали пару коммитов
  4. ...

Пункт 3 на данный момент невозможен без использования внешних инструментов. Поэтому от того, что пункт 2 можно выполнить через сайт, легче вообще не становится, ведь дальше тупик.


Я ничего нового в этом обсуждении не сказал - я уже репортил все это пару месяцев назад. Теперь выходит статья, которая описывает пункты 1 и 2, но как-то так случайно совпало, что пункта 3 в статье нет (хотя пункт 3 является логическим продолжением).

Git без бренчинга это как суп без бульона

 
Renat Fatkhullin #:
Будем исправлять шаг за шагом, включая работу в редакторе

Ренат, можете сказать, есть ли смысл переконвертировать все исходники в UTF-8 или ME будет дальше ориентироваться только на UTF-16 LE? Вроде бы где-то в ветках новых билдов или где-то ещё упоминалось про переход на UTF-8, но может показалось?