如何让Composer不为包创建.git目录

24

我找到了几篇相关的帖子,但它们并没有真正回答我的问题。 假设我想要安装这个软件包: https://github.com/pear/Net_Socket

以下是我的 composer.json 的一部分:

{
    "config": {
        "preferred-install": "dist"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/pear/Net_Socket.git"
        }
    ],
    "require": {
        "pear/net_socket": "*",
    }
}

所以我需要它在没有.git目录的情况下安装,这样它就不会被视为我的项目的子模块。 其他人说我该怎么做才能下载“dist”版本?我是否需要打上一个标签?

5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
20
如果一个包被视为git子模块,那么你没有将vendor文件夹从提交到你自己的存储库中排除。建议将vendor文件夹添加到.gitignore文件中,并不提交这些文件,只提交composer.lock(当然还有composer.json)。 除此之外,运行composer install --prefer-dist即可完成任务。请注意,如果您稍后改变主意,Composer似乎不会更改首选下载方法。如果Composer检测到克隆的存储库,则直接更新它比下载ZIP并解压缩要快。如果想要更改这一点,删除整个vendor文件夹并运行composer update --prefer-dist

但是如果我想将我的供应商文件夹保留为子模块呢? 我将其作为子模块制作,以便可以查看所有更改以及更新所进行的更改,以识别来自更新代码的新错误。 - Black

2

使用 --prefer-dist 是唯一的本地解决方案,但有些情况下可能没有打包版本可用,在这种情况下,Composer 仍会退回到 Git 克隆。

我知道的唯一解决方法是在 composer 安装后运行一个清理脚本,删除 Git 目录。可能像这样的命令:

find . -type d | grep .git | xargs rm -rf

请注意将此命令在您的供应商目录中运行,而非根目录


5
通过指定“vendor”目录,可以使命令更简单,也更安全:find vendor -type d -name \.git -exec rm -rf \{\} \; - JasonGabler
2
“find grep xargs rm” 命令是非常不安全的。首先,它将删除“xgit”,“bak.git”,“.github”等目录(因为它使用 grep .git 而不是像 grep '\/\.git$' 这样的命令)。其次,当存在包含空格的目录时,它将无法正确工作,并且会删除“my”和“configs”目录,而实际上存在“my .git configs”目录(因为它使用 xargs 而不是 -exec)。请查看下面的答案以获取安全的命令。 - Mihail H.

2

composer update --prefer-dist 运行良好,但更改 composer 包的默认下载方法(composer.json)可能更简单:

将以下行添加到您的 composer.json 文件中:

"config": {"preferred-install": "dist"}

这将使 Composer 下载存档版本而不是 Git 存储库。

{
"config": {
    "preferred-install": {
        "*": "dist"
    }
  }
}

https://getcomposer.org/doc/06-config.md#preferred-install


1

要安全地删除 "vendor" 目录中的仅包含 ".git" 的子目录,请使用:

find vendor -type d -name '.git' -exec rm -rf \{\} \+

0
希望这个工作即使在 Q 已经提出很长时间的情况下也能顺利进行。 这是在 composer.json 文件中。
"scripts": {       
    "post-update-cmd": ["echo [WARNING] Delete all .git dirs", "rm -rf vendor/**/**/.git"],
    "post-install-cmd": ["echo [WARNING] Delete all .git dirs", "rm -rf vendor/**/**/.git"]
},

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,