Как выполнить мелкий клон с помощью Composer?

У меня есть следующее composer.json:

{
    "require": {
        "php": ">=5.2.0",
        "queueit/KnownUser.V3.PHP": "dev-master"
    },
    "config": {
        "autoloader-suffix": "ComposerManager",
        "vendor-dir": "../../../all/libraries/composer"
    },
    "prefer-stable": true,
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "queueit/KnownUser.V3.PHP",
                "version": "dev-master",
                "source": {
                    "type": "git",
                    "url": "https://github.com/queueit/KnownUser.V3.PHP.git",
                    "reference": "master"
                }
            }
        }
    ]
}

Однако, когда я бегу:

$ composer -vvv update
...
Cloning master
Executing command (CWD): git clone --no-checkout 'https://github.com/queueit/KnownUser.V3.PHP.git' '.../sites/all/libraries/composer/queueit/KnownUser.V3.PHP' && cd '.../sites/all/libraries/composer/queueit/KnownUser.V3.PHP' && git remote add composer 'https://github.com/queueit/KnownUser.V3.PHP.git' && git fetch composer

процесс клонирования занимает очень много времени, а размер хранилища превышает 25 МБ:

$ du -hs ~/.composer/cache/vcs/https---github.com-queueit-KnownUser.V3.PHP.git/
25M ~/.composer/cache/vcs/https---github.com-queueit-KnownUser.V3.PHP.git/

Затем Composer останавливается с таймаутом:

[Symfony \ Component \ Процесс \ Исключение \ProcessTimedOutException]
Процесс "git clone --no-checkout 'https://github.com/queueit/KnownUser.V3.PHP.git' '.../sites/all/libraries/composer/queueit/KnownUser.V3.PHP' && cd '.../sites/all/libraries/composer/queueit/KnownUser.V3.PHP' && git remote add composer 'https://github.com/queueit/KnownUser.V3.PHP.git' && git fetch composer"превышено время ожидания 300 секунд.

Я предполагаю, что хранилище слишком большое, чтобы клонировать все объекты git.


Как я могу клонировать хранилище быстрее, используя неглубокий клон?

Например, передавая дополнительные --depth 1 или же --single-branch параметры git в команду Git, так что она может быть автоматически выбрана Composer?

Я ожидаю, что изменение будет автономным в рамках composer.json файл, поэтому не требуется никакой внешней настройки при вызове этого файла в других системах или другими пользователями при запуске composer install,

1 ответ

Решение

Мелкое клонирование с использованием Composer официально не поддерживается (без каких-либо исправлений), поскольку параметры git жестко заданы.

Уже есть запрос на добавление функции: Добавить поддержку для git shallow клонов. Однако реализация этой функции может вызвать некоторые проблемы (например, не достичь заблокированных коммитов, если глубина не так велика, @stof и другие).

Кроме того, есть запрос на извлечение, который пытается реализовать мелкие клоны, добавив дополнительный --git-clone-depth параметр (тесты показывают хорошие результаты). Однако изменение было отменено из-за более быстрых клонов git, использующих кеш.


Для быстрого взлома, можно редактировать параметры git в doDownload() в src/Composer/Downloader/GitDownloader.php например, путем изменения --depth 1 --single-branch в этой строке:

$command = 'git clone --no-checkout ...'

Или найдите способ применить настройку глубины 1 в git config.


Самый простой обходной путь (без каких-либо взломов) для больших репозиториев - просто увеличить время ожидания, указав переменную, например:

COMPOSER_PROCESS_TIMEOUT=0 composer install
Другие вопросы по тегам