git - 如何使用Composer进行浅克隆?

标签 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\Component\Process\Exception\ProcessTimedOutException]
The process "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" exceeded the timeout of 300 seconds.

我认为存储库太大,无法克隆所有 git 对象。


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

例如,通过将额外的 --depth 1--single-branch git 参数传递到 Git 命令中,以便 Composer 自动获取它?

我希望更改能够独立包含在 composer.json 文件中,因此在其他系统上或由其他用户在运行 时调用此文件时,不需要任何外部配置 Composer 安装

最佳答案

官方不支持使用Composer进行浅克隆(无需任何修补),因为git参数是硬编码的。

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

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


为了快速破解,可以在 src/Composer/Downloader/GitDownloader.php 中的 doDownload() 中编辑 git 参数,例如通过更改此行中的 --depth 1 --single-branch :

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

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


对于较大的存储库,最简单的解决方法(无需任何技巧)就是通过指定如下变量来增加超时:

COMPOSER_PROCESS_TIMEOUT=0 composer install

关于git - 如何使用Composer进行浅克隆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336174/

相关文章:

git - 查找在分支中专门更改的文件

php - 使用 git 维护不同版本的 webapp 的工作流程?

git - 为什么 git 在将文件复制到其他文件之上时会看到整个文件已更改?

php - 如何在共享主机上安装 Composer?

java - 是否可以浅拷贝单例类对象?

git - 如何查找 git 存储库的最后几次提交

twitter-bootstrap - 仅下载使用包管理器(Bower、npm、Composer)编译的 Bootstrap?

php - Composer 找不到本地 vcs 依赖项

git - 将 Git 子模块设置为浅克隆和稀疏 checkout ?

git - git中带有子模块的浅克隆,如何使用指向提交而不是最新提交?