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

Я хотел бы использовать популярную, систему отслеживания ошибок с открытым исходным кодом (Redmine), который предлагает интеграцию мерзавца. К сожалению, каждый проект в средстве отслеживания может только быть связан с одним мерзавцем repo. Создание нескольких проектов в средстве отслеживания не является моей идеальной установкой.

Имея это в виду, я попытался использовать слияние поддерева мерзавца (объясненный здесь, и здесь). Я создал "зонтик" repo, который объединился в каждом из многочисленных других repos, с которыми я работаю.

К сожалению, примеры, данные только, вытягивают в основном ответвлении каждого поддерева. Так как у меня есть разработка, продолжающаяся в нескольких ответвлениях каждого поддерева, я должен изучить, как иметь этот зонтик repo, отражают каждое ответвление каждого поддерева.

Действительно ли это возможно?

Дополнительный Кредит: Что, если 2 поддерева у каждого есть ответвление с тем же именем?

8
задан anthony 26 January 2010 в 07:11
поделиться

1 ответ

Нельзя использовать @ Autowired напрямую, так как контейнер сервлета создает экземпляры как jsps, так и servlets. Таким образом, они не являются частью контекста пружины и, следовательно, их зависимости не вводятся.

Можно:

  1. переместить весь код в чистые сервлеты, а не в jsps - оставить только представление в jsps.
  2. используйте @ Конфигурируемый на сервлетах (и добавьте javaagent, как описано в связанных документах)

Другой способ - сделать сервлет частью текущего контекста вручную. Это возможно как в jsps, так и в сервлетах:

public void init() {
    WebApplicationContext ctx = WebApplicationContextUtils
         .getRequiredWebApplicationContext(getServletContext());

    AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();

    bf.autowireBean(this);
}

Это позволит разрешить аннотированные зависимости @ Autowired .

Теперь я не уверен, требуются ли контейнеры сервлетов для использования только одного экземпляра класса сервлетов. В противном случае лучше поместить указанный выше код в метод получения для зависимости ( getDao () ), а если свойство @ Autowired имеет значение null (т. е. контейнер использует другой экземпляр класса сервлета) - выполнить указанную выше операцию.


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

-121--3545605-

Драйвер OGR Shapefile из GDAL/OGR напрямую использует реализацию Shapelib, поэтому фактически нет никакой разницы. При проверке исходного дерева OGR будут найдены файлы Shapelib, такие как shpopen.c и dbfopen.c .

Кроме того, Фрэнк Вармердам является автором обоих, Shapelib и OGR, и я могу подтвердить себя, что Фрэнк сохраняет shpopen.c и dbfopen.c в синхронизации между Shapelib и OGR.

В целом, между Shapelib и OGR нет различий относительно реализации спецификации формата Shapefile.

-121--2447914-

Для тех, кто не знаком с Redmine, пожалуйста, расширьте свое описание, чтобы включить ответы на следующие вопросы: Какой доступ нужен трекеру? Нужно ли ему делать свои собственные обязательства? Или же требуется определенный доступ для чтения (возможно, для проверки хэшей фиксации и сканирования журналов фиксации для ключевых слов)?

Если трекеру требуется только доступ для чтения, возможно, вообще не потребуется слияние поддерева. Вполне допустимо иметь несколько начальных фиксаций (допускающих несколько независимых историй) в одном репозитории. Сам проект Git делает это для некоторых «дополнений» ( man , html , todo ), которые не имеют общего с (commit) истории, но публикуются вместе с основным набором ветвей для исходного кода ( maint , master , next , pu ). Для вашей цели может быть достаточно настроить пульт дистанционного управления для каждого субпозитария и извлечь их советы по филиалам в агрегирующий репозиторий. Может быть, достаточно автоматических ветвей дистанционного слежения»,или, возможно, вам нужно сделать дополнительный шаг для создания (и обновления) локальных филиалов на основе удаленных филиалов отслеживания.

Описываемая схема слияния поддеревьев, вероятно, не имеет смысла в общей ситуации, когда ветви в исходных репозитариях не связаны друг с другом или являются полусвязанными. Но если все исходные репозитории имеют общий набор ветвей, где каждая ветвь имеет одну и ту же цель для всех репозиториев, возможно, их можно эффективно объединить в некий суперрепозитарий.

Но интересный вопрос заключается не в том, «что если у двух репозиториев есть ветви с одним и тем же именем?», а в том, «как вы справляетесь со случаем, когда в репозитории отсутствует ветвь из общего, глобального набора?».

Если все субрепозитории имеют одинаковый набор ветвей, вы просто делаете то, что сделали с master , но один раз для каждой ветви. Проблема возникает, когда определенная ветвь отсутствует в репозитории. Вы можете заменить его основную запись , но это не всегда может быть правильным ответом. Это зависит от того, почему вы объединяете репозитории, и от того, что вы ожидаете «увидеть» в этом поддереве этой ветви в суперрепозитории.

Если субрепозитории не тесно связаны, то я действительно сомневаюсь в обоснованности этого подхода поддерева. Такой подход к несвязанным хранилищам кажется «идущим против зерна». Это, наверное, еще возможно, но я сомневаюсь, что есть какой-то инструмент, чтобы помочь, и вам нужно будет потратить некоторое время на планирование угловых дел.

Если в конечном итоге происходит слияние поддеревьев, можно обратиться к сторонней команде git поддерево . Это может помочь в синхронизации множества репозиториев.


Сбор ветвей, без слияния

Если Redmine указывает клон -mirror , подразумевается, что он ожидает локальных ветвей и может не иметь возможности непосредственно читать «ветви удаленного отслеживания», поэтому вам, вероятно, потребуется создать и обновить некоторые локальные ветви.

Локальные филиалы обновлены из «Удаленных филиалов отслеживания»
  • Начальная настройка

     mkdir $ COLLECTION _ REPO & & cd $ COLLECTION _ REPO & &
    git init
    git remote add alpha < url/path-to-alpha-repo >
    git remote add bravo < url/path-to-bravo-repo >
    git remote add charlie < url/path-to-charlie-repo >
    для r в $ (git remote); сделать
    git config --add remote. $ r.fetch\
    «$ (git config remote. $ r.fetch | sed -e 's.heads.tags.; s.remotes.tags/all.')»
    git config remote. $ r.tagopt --no-теги
    готово
    
  • Периодическое обновление

     Получить удаленное обновление
    git for-each-ref --shell --format\
    'git branch --force --track -l all/% (имя ссылки: короткое)% (имя ссылки: короткое)' refs/remotes\
    | ш
    
Локальные ветви, непосредственно получающие полученные советы по ветвям
  • Начальная настройка

     mkdir $ COLLECTION _ REPO & & cd $ COLLECTION _ REPO & &
    git init
    git remote add alpha < url/path-to-alpha-repo >
    git remote add bravo < url/path-to-bravo-repo >
    git remote add charlie < url/путь-в-шарли-репо >
    для r в $ (git remote); сделать
    git config remote. $ r.fetch\
    «$ (git config remote. $ r.fetch | sed -e 's.remotes.heads/all'.)»
    git config --add remote. $ r.fetch\
    «$ (git config remote. $ r.fetch | sed -e 's.heads.tags.g')»
    git config remote. $ r.tagopt --no-теги
    готово
    
  • Периодическое обновление

     Получить удаленное обновление
    

Оба метода заканчивают сбор ветвей в refs/heads/all/< имя _ удаленного _ пользователя >/< имя _ филиала на _ удаленном _ компьютере > , но первый также имеет повторяющийся набор ссылок в refs/remotes/< имя _ удаленного _ пользователя >/< имя _ филиала на _ удаленном _ компьютере > . Первый использует нормальную выборку refspec и использует git ветвь для дублирования «ветви удаленного отслеживания» ( refs/remotes/... ) в нормальные локальные ветви ( refs/heads/all/... ). Второй использует пользовательский рефспек для хранения выбранных ссылок непосредственно в целевой иерархии ссылок.

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

Если Redmine может обрабатывать голое хранилище, я бы рекомендовал использовать его. Используйте git init --bare и имя репо, оканчивающееся на .git. Также git config core.logAllRefUpdates true может быть хорошей идеей (так как по умолчанию в голом репозитории используется значение false).

Помимо префикса all/ в пространствах имен, другое различие между этим подходом и полным клоном -mirror состоит в том, что ссылки вне refs/heads и refs/tags не собираются. Большинство других распространенных ссылок считаются «локальными» в хранилище (из-за чего они не копируются обычным клоном). Некоторые из других ссылок являются «удаленными ветвями отслеживания» ( refs/remotes ), некоторыми записями «bisect» ( refs/bisect ), git filter-branch «original» ref backup ( refs/original ) и т.д. Вероятно, ни одна из этих вещей не важна для Редмина. Если они есть, они также могут быть включены в дополнительные ссылки.

Создание дополнительных начальных фиксаций

Чтобы создать ветвь с новой начальной фиксацией, см. страницу GitTips в разделе Как создать новую ветвь без предка . Два рецепта включают в себя другой репозиторий, из которого вы нажимаете или извлекаете ветвь после прохождения обычного шага init/add/commit (именно то, что вышеуказанные рецепты делают автоматизированным путем).

7
ответ дан 5 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: