如何使用Composer执行浅克隆?

时间:2017-11-16 17:50:52

标签: git composer-php shallow-clone

我有以下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

克隆过程需要很长时间,并且存储库的大小增长超过25MB:

$ 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的\元器件\过程\异常\ 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对象。

如何使用a shallow clone更快地克隆存储库?

例如,通过将额外的--depth 1--single-branch git参数传递给Git命令,它可以被Composer自动拾取吗?

我希望更改在composer.json文件中是自包含的,因此在运行composer install时在其他系统或其他用户调用此文件时不需要外部配置。

1 个答案:

答案 0 :(得分:3)

使用 Composer 的浅层克隆不受官方支持(没有任何修补),因为 git 参数是硬编码的。

已添加此功能请求:Add support for git shallow clones。但是,实现此功能可能会导致一些问题(例如,如果深度不是很高 @stof 等,则无法达到锁定提交。

此外,有一个pull request尝试通过添加额外的--git-clone-depth参数来实现浅克隆(测试显示了一些好的结果)。但是,由于faster git clones using cache,该更改已被放弃。

对于快速入侵,可以在doDownload()的{​​{1}}中编辑git参数,例如通过更改此行中的src/Composer/Downloader/GitDownloader.php

--depth 1 --single-branch

或者找到将深度1设置应用到git config中的方法。

更大的存储库最简单的解决方法(没有任何黑客攻击)只是通过指定变量来增加超时:

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