article/git/git-bash.md
2023-07-03 16:23:52 +08:00

5.1 KiB
Raw Blame History

git-bash mingw64高级操作

安装pacman 包管理器

依次下载以下包并解压至 Git 安装根目录:

pacman需要将usr/bin 中的 pacman.exe 改为 pacman

https://packages.msys2.org/package/pacman?repo=msys&variant=x86_64

pacman-mirrors

https://packages.msys2.org/package/pacman-mirrors?repo=msys&variant=x86_64

msys2-keyring

https://packages.msys2.org/package/msys2-keyring?repo=msys&variant=x86_64

一个是 pacman 主包,一个是源,一个是源秘钥。

然后改源:清华大学源传送门:https://mirrors.tuna.tsinghua.edu.cn/help/msys2/ (用 vscode 在 Git 根目录找到文件夹直接改)

这时候去执行 pacman 不出意外是会不行的,什么签名未信任,无效的数据库,无法锁定数据库之类的,问题不大。

依次执行以下命令:

刷新秘钥:

pacman-key --refresh-keys
pacman-key --init
pacman-key --populat

清除缓存:

pacman -Sc

更新系统:

pacman -Syu

不出意外应该是不会有报错了,后面该咋用就咋用吧。

pacman 基本操作

pacman 安装软件

pacman -S 软件名: 安装软件。也可以同时安装多个包,只需以空格分隔包名即可。
pacman -S --needed 软件名1 软件名2: 安装软件,但不重新安装已经是最新的软件。
pacman -Sy 软件名:安装软件前,先从远程仓库下载软件包数据库(数据库即所有软件列表)。
pacman -Sv 软件名:在显示一些操作信息后执行安装。
pacman -Sw 软件名: 只下载软件包,不安装。

pacman 更新软件

pacman -Sy: 从服务器下载新的软件包数据库(实际上就是下载远程仓库最新软件列表到本地)。
pacman -Su: 升级所有已安装的软件包。
pacman -Syu 结合上面两个操作
#在msys2中 pacman -Syu后需要重启一下msys2(关掉shell重新打开即可)。

pacman 卸载软件

# usage: pacman {-R --remove} [options] <package(s)>

pacman -R 软件名: 该命令将只删除包,保留其全部已经安装的依赖关系
pacman -Rv 软件名: 删除软件,并显示详细的信息
pacman -Rs 软件名: 删除软件,同时删除本机上只有该软件依赖的软件。
pacman -Rsc 软件名: 删除软件,并删除所有依赖这个软件的程序,慎用
pacman -Ru 软件名: 删除软件,同时删除不再被任何软件所需要的依赖

pacman 搜索

pacman -Ss 关键字: 在远端仓库中搜索匹配字符串的软件包(本地已安装的会标记)
pacman -Sl <repo>:显示软件仓库中所有软件的列表
pacman -Qs 关键字: 在本地已安装包中搜索匹配字符串的软件包
pacman -Qu: 列出所有可升级的软件包
pacman -Qt: 列出不被任何软件要求的软件包
pacman -Q 软件名: 查看软件包是否已安装,已安装则显示软件包名称和版本
pacman -Qi 软件名: 查看某个软件包信息,显示较为详细的信息,包括描述、构架、依赖、大小等等
pacman -Ql 软件名: 列出软件包内所有文件,包括软件安装的每个文件、文件夹的名称和路径

pacman 清理

pacman -Sc清理已删除的包文件从缓存目录 /var/cache/pacman/pkg/
pacman -Scc清理所有的缓存文件。

用 pacman 排除常见错误

提交事务失败(文件冲突)

如果你看到以下报错:

error: could not prepare transaction
error: failed to commit transaction (conflicting files)
package: /path/to/file exists in filesystem
Errors occurred, no packages were upgraded.
这是因为 pacman 检测到文件冲突,不会为你覆盖文件。

解决这个问题的一个安全方法是首先检查另一个包是否拥有这个文件pacman-Qo 文件路径)。如果该文件属于另一个包,请提交错误报告。如果文件不属于另一个包,请重命名“存在于文件系统中”的文件,然后重新发出更新命令。如果一切顺利,文件可能会被删除。

你可以显式地运行 pacman -S deepin-movie --overwrite "*" 覆盖与 给模式匹配的文件,而不是手动重命名并在以后删除属于该包的所有文件。

提交事务失败(包无效或损坏)

在 /var/cache/pacman/pkg/ 中查找 .part 文件(部分下载的包),并将其删除。这通常是由在 pacman.conf 文件中使用自定义 XferCommand 引起的。

初始化事务失败(无法锁定数据库)

当 pacman 要修改包数据库时,例如安装包时,它会在 /var/lib/pacman/db.lck 处创建一个锁文件。这可以防止 pacman 的另一个实例同时尝试更改包数据库。

如果 pacman 在更改数据库时被中断,这个过时的锁文件可能仍然保留。如果你确定没有 pacman 实例正在运行,那么请删除锁文件。

检查进程是否持有锁定文件:

lsof /var/lib/pacman/db.lck
如果上述命令未返回任何内容,则可以删除锁文件:

rm /var/lib/pacman/db.lck
如果你发现 lsof 命令输出了使用锁文件的进程的 PID请先杀死这个进程然后删除锁文件。

我希望你喜欢我对 pacman 基础命令的介绍。