Русский ▾ Topics ▾ Latest version ▾ git-cvsserver last updated in 2.50.0

НАЗВАНИЕ

git-cvsserver - Эмулятор CVS-сервера для Git

ОБЗОР

SSH:

export CVS_SERVER="git cvsserver"
cvs -d :ext:user@server/path/repo.git co <имя_HEAD>

pserver (/etc/inetd.conf):

cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver

Использование:

git-cvsserver [<параметры>] [pserver|server] [<каталог> …​]

ОПИСАНИЕ

Это приложение является уровнем эмуляции CVS для Git.

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

Тестирование проводилось с использованием как CLI-клиента CVS, так и плагина CVS для Eclipse. Большая часть функциональности отлично работает с обоими этими клиентами.

ПАРАМЕТРЫ

Все эти параметры, очевидно, имеют смысл только в том случае, если они принудительно заданы на стороне сервера. Они реализованы так, чтобы как можно точнее соответствовать параметрам git-daemon[1].

--base-path <путь>

Добавляет путь в начало запрошенного CVSROOT

--strict-paths

Не разрешать рекурсивный обход в подкаталоги

--export-all

Не проверять gitcvs.enabled в конфигурации. Вы также должны указать список разрешённых каталогов (см. ниже), если хотите использовать этот параметр.

-V
--version

Вывести информацию о версии и выйти

-h
-H
--help

Вывести информацию об использовании и выйти

<directory>

Оставшиеся аргументы предоставляют список каталогов. Если каталоги не заданы, то разрешены все. Репозитории в этих каталогах по-прежнему требуют параметра конфигурации gitcvs.enabled, если не указан --export-all.

ОГРАНИЧЕНИЯ

Клиенты CVS не могут создавать метки, ветки или выполнять слияния Git.

git-cvsserver сопоставляет ветки Git с модулями CVS. Это сильно отличается от того, что ожидают большинство пользователей CVS, поскольку в CVS модули обычно представляют один или несколько каталогов.

УСТАНОВКА

  1. Если вы собираетесь предоставить доступ к CVS через pserver, добавьте строку в /etc/inetd.conf, например

       cvspserver stream tcp nowait nobody git-cvsserver pserver

    Примечание: Некоторые серверы inetd позволяют указать имя исполняемого файла независимо от значения argv[0] (т.е. имени, с которым, как предполагает программа, она была запущена). В этом случае правильная строка в /etc/inetd.conf выглядит так

       cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver

    По умолчанию pserver предоставляет только анонимный доступ. Чтобы выполнять коммиты, вам нужно создать учётные записи pserver, просто добавив настройку gitcvs.authdb в файл конфигурации репозиториев, для которых вы хотите разрешить запись cvsserver, например:

       [gitcvs]
    	authdb = /etc/cvsserver/passwd

    Формат этих файлов: имя пользователя, за которым следует зашифрованный пароль, например:

       myuser:sqkNi8zPf01HI
       myuser:$1$9K7FzU28$VfF6EoPYCJEYcVQwATgOP/
       myuser:$5$.NqmNH1vwfzGpV8B$znZIcumu1tNLATgV2l6e1/mY8RzhUDHMOaVOeL1cxV3

    Вы можете использовать утилиту htpasswd, поставляемую с Apache, для создания этих файлов, но только с опцией -d (или -B, если ваша система поддерживает её).

    Предпочтительно использовать системную утилиту, которая управляет созданием хешей паролей на вашей платформе (например, mkpasswd в Linux, encrypt в OpenBSD или pwhash в NetBSD), и вставить её в нужное место.

    Затем укажите свой пароль с помощью метода pserver, например:

       cvs -d:pserver:someuser:somepassword@server:/path/repo.git co <имя_HEAD>

    Для доступа по SSH не требуется специальной настройки, кроме наличия инструментов Git в PATH. Если у вас есть клиенты, которые не принимают переменную окружения CVS_SERVER, вы можете переименовать git-cvsserver в cvs.

    Примечание: Новые версии CVS (>= 1.12.11) также поддерживают указание CVS_SERVER непосредственно в CVSROOT, например

       cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co <имя_HEAD>

    Преимущество этого заключается в том, что он будет сохранён в ваших файлах CVS/Root, и вам не нужно беспокоиться о постоянной установке правильной переменной окружения. Пользователям SSH, ограниченным git-shell, не нужно (и не следует) переопределять значение по умолчанию с помощью CVS_SERVER, поскольку git-shell понимает cvs как git-cvsserver и делает вид, что другой конец лучше запускает настоящий cvs.

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

       [gitcvs]
            enabled=1
            # необязательно для отладки
    	logFile=/путь/к/файлу-журнала

    Примечание: вам необходимо убедиться, что каждый пользователь, который будет вызывать git-cvsserver, имеет доступ на запись к файлу журнала и к базе данных (см. Внутренний механизм базы данных. Если вы хотите предоставить доступ на запись через SSH, пользователи, конечно, также должны иметь доступ на запись к самому репозиторию Git.

    Вам также необходимо убедиться, что каждый репозиторий является «голым» (без файла индекса Git) для работы cvs commit. См. gitcvs-migration[7].

    Все переменные конфигурации также могут быть переопределены для конкретного метода доступа. Допустимые имена методов: "ext" (для доступа по SSH) и "pserver". Следующий пример конфигурации отключает доступ через pserver, но по-прежнему разрешает доступ через SSH.

       [gitcvs]
            enabled=0
    
       [gitcvs "ext"]
            enabled=1
  3. Если вы не указали CVSROOT/CVS_SERVER непосредственно в команде извлечения, автоматически сохраняя его в своих файлах CVS/Root, то вам необходимо явно установить их в своём окружении. CVSROOT должен быть установлен как обычно, но каталог должен указывать на соответствующий репозиторий Git. Как указано выше, для SSH-клиентов, не ограниченных git-shell, CVS_SERVER должен быть установлен в git-cvsserver.

       export CVSROOT=:ext:user@server:/var/git/project.git
       export CVS_SERVER="git cvsserver"
  4. Для SSH-клиентов, которые будут выполнять коммиты, убедитесь, что их файлы окружения .ssh/environment на стороне сервера (или .bashrc и т.д., в соответствии с их конкретной оболочкой) экспортируют соответствующие значения для GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, GIT_COMMITTER_NAME и GIT_COMMITTER_EMAIL. Для SSH-клиентов, чьей оболочкой входа является bash, .bashrc может быть разумной альтернативой.

  5. Теперь клиенты должны иметь возможность извлечь проект. Используйте имя module CVS, чтобы указать, какую Git head вы хотите извлечь. Это также устанавливает имя вашего вновь извлечённого каталога, если вы не укажете иное с помощью -d <имя-каталога>. Например, это извлекает ветку master в каталог project-master:

       cvs co -d project-master master

ВНУТРЕННИЙ МЕХАНИЗМ БАЗЫ ДАННЫХ

git-cvsserver использует одну базу данных на голову Git (т.е. модуль CVS) для хранения информации о репозитории для поддержания согласованных номеров редакций CVS. База данных должна обновляться (т.е. в неё должны выполняться записи) после каждого коммита.

Если коммит выполняется непосредственно с помощью git (в отличие от использования git-cvsserver), обновление должно будет произойти при следующем обращении к репозиторию со стороны git-cvsserver, независимо от метода доступа и запрошенной операции.

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

По умолчанию он использует базы данных SQLite в каталоге Git с именем gitcvs.<имя-модуля>.sqlite. Обратите внимание, что внутренний механизм SQLite создаёт временные файлы в том же каталоге, что и файл базы данных, при записи, поэтому может быть недостаточно предоставить пользователям, использующим git-cvsserver, доступ на запись к файлу базы данных, не предоставляя им также доступ на запись к каталогу.

База данных не может быть надёжно регенерирована в согласованной форме после изменения отслеживаемой ею ветки. Пример: для слитых веток git-cvsserver отслеживает только одну ветку разработки, и после git merge база данных, обновляемая инкрементально, может отслеживать другую ветку, чем база данных, регенерированная с нуля, что приводит к несогласованным номерам редакций CVS. git-cvsserver не может знать, какую ветку он бы выбрал, если бы он выполнялся инкрементально до слияния. Поэтому, если вам нужно полностью или частично (из старой резервной копии) регенерировать базу данных, вы должны относиться с подозрением к уже существующим песочницам CVS.

Вы можете настроить внутренний механизм базы данных с помощью следующих переменных конфигурации:

Настройка внутреннего механизма базы данных

git-cvsserver использует модуль Perl DBI. Пожалуйста, также прочитайте его документацию, если вы изменяете эти переменные, особенно о DBI->connect().

gitcvs.dbName

Имя базы данных. Точное значение зависит от выбранного драйвера базы данных, для SQLite это имя файла. Поддерживает подстановку переменных (см. ниже). Не может содержать точку с запятой (;). По умолчанию: %Ggitcvs.%m.sqlite

gitcvs.dbDriver

Используемый драйвер DBI. Вы можете указать здесь любой доступный драйвер, но он может не работать. cvsserver протестирован с DBD::SQLite, сообщается, что он работает с DBD::Pg, и сообщается, что он не работает с DBD::mysql. Пожалуйста, рассматривайте это как экспериментальную функцию. Не может содержать двоеточия (:). По умолчанию: SQLite

gitcvs.dbuser

Пользователь базы данных. Полезен только при установке dbDriver, поскольку в SQLite нет понятия пользователей базы данных. Поддерживает подстановку переменных (см. ниже).

gitcvs.dbPass

Пароль базы данных. Полезен только при установке dbDriver, поскольку в SQLite нет понятия паролей базы данных.

gitcvs.dbTableNamePrefix

Префикс имени таблицы базы данных. Поддерживает подстановку переменных (см. ниже). Любые небуквенные символы будут заменены символами подчёркивания.

Все переменные также могут быть установлены для каждого метода доступа, см. выше.

Подстановка переменных

В dbDriver и dbUser вы можете использовать следующие переменные:

%G

Имя каталога Git

%g

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

%m

Имя модуля CVS/головы Git

%a

метод доступа (один из "ext" или "pserver")

%u

Имя пользователя, запускающего git-cvsserver. Если имя не может быть определено, используется числовой uid.

ОКРУЖЕНИЕ

Эти переменные устраняют необходимость в параметрах командной строки в некоторых обстоятельствах, позволяя более лёгкое ограниченное использование через git-shell.

GIT_CVSSERVER_BASE_PATH

Эта переменная заменяет аргумент --base-path.

GIT_CVSSERVER_ROOT

Эта переменная указывает один каталог, заменяя список аргументов <каталог>.... Репозиторий по-прежнему требует параметра конфигурации gitcvs.enabled, если не указан --export-all.

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

ЗАМЕТКИ О КЛИЕНТЕ CVS ДЛЯ ECLIPSE

Чтобы выполнить извлечение с помощью клиента CVS Eclipse:

  1. Выберите "Create a new project → From CVS checkout"

  2. Создайте новое местоположение. См. примечания ниже для получения подробной информации о том, как выбрать правильный протокол.

  3. Просмотрите доступные модули. Вы получите список голов в репозитории. Вы не сможете просмотреть дерево оттуда. Только головы.

  4. Выберите HEAD, когда будет спрошено, какую ветку/метку извлечь. Снимите флажок "launch commit wizard", чтобы избежать фиксации файла .project.

Примечания по протоколам: Если вы используете анонимный доступ через pserver, просто выберите его. Те, кто использует доступ по SSH, должны выбрать протокол ext и настроить доступ ext на панели Preferences→Team→CVS→ExtConnection. Установите CVS_SERVER в "git cvsserver". Обратите внимание, что поддержка паролей не очень хороша при использовании ext, вам определённо нужно будет настроить ключи SSH.

В качестве альтернативы вы можете просто использовать нестандартный протокол extssh, который предлагает Eclipse. В этом случае CVS_SERVER игнорируется, и вам придётся заменить утилиту cvs на сервере на git-cvsserver или манипулировать вашим .bashrc, чтобы вызов cvs фактически вызывал git-cvsserver.

КЛИЕНТЫ, О КОТОРЫХ ИЗВЕСТНО, ЧТО ОНИ РАБОТАЮТ

  • CVS 1.12.9 на Debian

  • CVS 1.11.17 на MacOSX (из пакета Fink)

  • Eclipse 3.0, 3.1.2 на MacOSX (см. Заметки о клиенте CVS для Eclipse)

  • TortoiseCVS

ПОДДЕРЖИВАЕМЫЕ ОПЕРАЦИИ

Поддерживаются все операции, необходимые для нормального использования, включая checkout, diff, status, update, log, add, remove, commit.

Большинство аргументов команд CVS, которые читают метки CVS или номера редакций (обычно -r), работают, а также поддерживают любой спецификатор ссылки Git (метка, ветка, идентификатор коммита и т.д.). Однако номера редакций CVS для веток, отличных от основных, эмулируются не очень хорошо, и cvs log вообще не показывает метки или ветки. (Номера редакций CVS для неосновных веток внешне напоминают номера редакций CVS, но на самом деле они напрямую кодируют идентификатор коммита Git, а не представляют количество редакций с точки ветвления.)

Обратите внимание, что существует два способа извлечь конкретную ветку. Как описано в другом месте на этой странице, параметр "module" команды cvs checkout интерпретируется как имя ветки, и она становится основной веткой. Она остаётся основной веткой для данной песочницы, даже если вы временно сделаете другую ветку «липкой» с помощью cvs update -r. В качестве альтернативы аргумент -r может указывать на другую ветку для фактического извлечения, даже если модуль всё ещё является «основной» веткой. Компромиссы (как реализовано в настоящее время): Каждый новый «модуль» создаёт новую базу данных на диске с историей для данного модуля, и после создания базы данных операции с этой основной веткой выполняются быстро. Или, в качестве альтернативы, -r не занимает дополнительного дискового пространства, но может быть значительно медленнее для многих операций, таких как cvs update.

Если вы хотите сослаться на спецификатор ссылки Git, который содержит символы, не разрешённые CVS, у вас есть два варианта. Во-первых, возможно, сработает простая передача спецификатора ссылки Git соответствующему аргументу CVS -r; похоже, некоторые клиенты CVS не выполняют тщательной проверки аргумента. Во-вторых, если это не сработает, вы можете использовать специальный механизм экранирования символов, который использует только символы, допустимые в метках CVS. Последовательность из 4 или 5 символов вида (подчёркивание ("_"), дефис ("-"), один или два символа и дефис ("-")) может кодировать различные символы на основе одной или двух букв: "s" для косой черты ("/"), "p" для точки ("."), "u" для подчёркивания ("_") или две шестнадцатеричные цифры для любого байтового значения (обычно число ASCII или, возможно, часть символа в кодировке UTF-8).

Устаревшие операции мониторинга не поддерживаются (edit, watch и связанные с ними). Экспорт и маркировка (метки и ветки) на данном этапе не поддерживаются.

Преобразования окончаний строк CRLF

По умолчанию сервер оставляет режим -k пустым для всех файлов, что заставляет клиент CVS обрабатывать их как текстовые файлы, подверженные преобразованию окончаний строк на некоторых платформах.

Вы можете заставить сервер использовать атрибуты преобразования окончаний строк для установки режимов -k для файлов, установив переменную конфигурации gitcvs.usecrlfattr. Дополнительную информацию о преобразовании окончаний строк см. в gitattributes[5].

В качестве альтернативы, если конфигурация gitcvs.usecrlfattr не включена или атрибуты не позволяют автоматически определить имя файла, то сервер использует конфигурацию gitcvs.allBinary для настройки по умолчанию. Если gitcvs.allBinary установлен, то файлы, не указанные иным образом, по умолчанию будут иметь режим -kb. В противном случае режим -k остаётся пустым. Но если gitcvs.allBinary установлен в "guess", то правильный режим -k будет угадан на основе содержимого файла.

Для наилучшей совместимости с cvs, вероятно, лучше всего переопределить значения по умолчанию, установив gitcvs.usecrlfattr в true, а gitcvs.allBinary в "guess".

ЗАВИСИМОСТИ

git-cvsserver зависит от DBD::SQLite.

GIT

Является частью пакета git[1]