20260608160402
This commit is contained in:
1 parent
1fd956966c
commit
930f03954a
339 files changed
+2175
-140695
No files matched your search
@@ -1,45 +1,269 @@
|
||||
# Conda(Python环境与包管理)
|
||||
# Conda(Python 环境与包管理)
|
||||
|
||||
## 介绍
|
||||
Anaconda 是一个免费、易于安装的包管理器、环境管理器和 Python 发行版,包含 1,500 多个开源包,并提供 免费社区支持。Anaconda 与平台无关,因此无论您在 Windows、macOS 还是 Linux 上都可以使用它。
|
||||
Conda 用来管理 Python 版本、虚拟环境和依赖包。做 AI、数据处理、OCR、深度学习项目时,建议每个项目单独创建一个环境,避免依赖互相污染。
|
||||
|
||||
## 安装
|
||||
下载地址:https://www.anaconda.com/download/success?reg=skipped
|
||||
|
||||
下载 Miniconda 即可
|
||||
推荐安装 Miniconda,体积更小,后续按需安装依赖即可。
|
||||
|
||||
- Miniconda:https://docs.conda.io/projects/miniconda/en/latest/
|
||||
- Anaconda:https://www.anaconda.com/download/success?reg=skipped
|
||||
|
||||
### Windows
|
||||
|
||||
下载 exe 文件按照步骤安装即可。
|
||||
下载 `.exe` 安装包后按步骤安装。安装完成后,如果命令行无法识别 `conda`,将下面目录加入系统环境变量:
|
||||
|
||||
#### 设置环境变量
|
||||
|
||||
将 `D:\devtool\anaconda3\condabin` 添加到环境变量中即可
|
||||
|
||||
|
||||
## 常用命令
|
||||
|
||||
**创建环境**
|
||||
```bash
|
||||
conda create -n myenv python=3.9
|
||||
```text
|
||||
D:\devtool\anaconda3\condabin
|
||||
```
|
||||
|
||||
**激活环境**
|
||||
检查是否安装成功:
|
||||
|
||||
```bash
|
||||
conda --version
|
||||
```
|
||||
|
||||
初始化 Shell:
|
||||
|
||||
```bash
|
||||
conda init
|
||||
```
|
||||
|
||||
:::tip
|
||||
执行 `conda init` 后,关闭并重新打开终端再使用 `conda activate`。
|
||||
:::
|
||||
|
||||
## 环境管理
|
||||
|
||||
### 创建环境
|
||||
|
||||
```bash
|
||||
# 创建指定 Python 版本的环境
|
||||
conda create -n myenv python=3.10
|
||||
|
||||
# 创建环境并同时安装常用包
|
||||
conda create -n myenv python=3.10 numpy pandas
|
||||
```
|
||||
|
||||
### 激活与退出
|
||||
|
||||
```bash
|
||||
# 激活环境
|
||||
conda activate myenv
|
||||
```
|
||||
|
||||
**退出环境**
|
||||
```bash
|
||||
# 退出当前环境
|
||||
conda deactivate
|
||||
```
|
||||
|
||||
**删除环境**
|
||||
### 查看环境
|
||||
|
||||
```bash
|
||||
# 查看所有环境
|
||||
conda env list
|
||||
|
||||
# 或者
|
||||
conda info --envs
|
||||
```
|
||||
|
||||
### 删除环境
|
||||
|
||||
```bash
|
||||
conda remove -n myenv --all
|
||||
```
|
||||
|
||||
**查看所有环境**
|
||||
:::warning
|
||||
删除环境会移除该环境里的 Python 和所有依赖包,执行前确认环境名是否正确。
|
||||
:::
|
||||
|
||||
## 包管理
|
||||
|
||||
```bash
|
||||
conda env list
|
||||
```
|
||||
# 安装包
|
||||
conda install numpy
|
||||
|
||||
# 安装指定版本
|
||||
conda install python=3.10
|
||||
conda install numpy=1.26
|
||||
|
||||
# 从指定 channel 安装
|
||||
conda install -c conda-forge opencv
|
||||
|
||||
# 更新包
|
||||
conda update numpy
|
||||
|
||||
# 删除包
|
||||
conda remove numpy
|
||||
|
||||
# 查看当前环境已安装的包
|
||||
conda list
|
||||
```
|
||||
|
||||
如果 Conda 找不到包,可以在当前环境中使用 `pip`:
|
||||
|
||||
```bash
|
||||
pip install 包名
|
||||
```
|
||||
|
||||
:::tip
|
||||
同一个环境里可以混用 `conda` 和 `pip`,但建议优先用 `conda` 安装底层依赖较重的包,例如 `numpy`、`opencv`、`pytorch`。
|
||||
:::
|
||||
|
||||
## 镜像源
|
||||
|
||||
网络较慢时可以配置清华镜像源。
|
||||
|
||||
### Conda 源
|
||||
|
||||
```bash
|
||||
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
|
||||
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
|
||||
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
|
||||
conda config --set show_channel_urls yes
|
||||
```
|
||||
|
||||
查看当前配置:
|
||||
|
||||
```bash
|
||||
conda config --show channels
|
||||
```
|
||||
|
||||
恢复默认源:
|
||||
|
||||
```bash
|
||||
conda config --remove-key channels
|
||||
```
|
||||
|
||||
### pip 源
|
||||
|
||||
Conda 环境里经常也会使用 `pip install`。`pip` 使用的是 PyPI 源,和上面的 Conda channel 不是同一套配置。
|
||||
|
||||
参考:清华大学开源软件镜像站 PyPI 帮助页:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
|
||||
|
||||
临时使用清华 PyPI 源安装某个包:
|
||||
|
||||
```bash
|
||||
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple some-package
|
||||
```
|
||||
|
||||
:::tip
|
||||
地址末尾的 `simple` 不能省略;`pip` 要求使用 `https`。
|
||||
:::
|
||||
|
||||
设置为默认 PyPI 源:
|
||||
|
||||
```bash
|
||||
python -m pip install --upgrade pip
|
||||
pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
|
||||
```
|
||||
|
||||
如果默认源访问很慢,可以临时使用清华源升级 `pip`:
|
||||
|
||||
```bash
|
||||
python -m pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple --upgrade pip
|
||||
```
|
||||
|
||||
查看当前 `pip` 配置:
|
||||
|
||||
```bash
|
||||
pip config list
|
||||
```
|
||||
|
||||
取消全局 PyPI 源配置:
|
||||
|
||||
```bash
|
||||
pip config unset global.index-url
|
||||
```
|
||||
|
||||
配置额外源:
|
||||
|
||||
```bash
|
||||
pip config set global.extra-index-url "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
|
||||
```
|
||||
|
||||
## 环境导出与迁移
|
||||
|
||||
### 导出环境
|
||||
|
||||
```bash
|
||||
conda env export > environment.yml
|
||||
```
|
||||
|
||||
### 根据文件创建环境
|
||||
|
||||
```bash
|
||||
conda env create -f environment.yml
|
||||
```
|
||||
|
||||
### 更新已有环境
|
||||
|
||||
```bash
|
||||
conda env update -f environment.yml --prune
|
||||
```
|
||||
|
||||
### 导出精简依赖
|
||||
|
||||
只导出手动安装的依赖,适合项目记录:
|
||||
|
||||
```bash
|
||||
conda env export --from-history > environment.yml
|
||||
```
|
||||
|
||||
## 清理缓存
|
||||
|
||||
```bash
|
||||
# 清理安装包缓存
|
||||
conda clean -p
|
||||
|
||||
# 清理 tar 包缓存
|
||||
conda clean -t
|
||||
|
||||
# 清理所有可清理缓存
|
||||
conda clean -a
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### conda activate 不生效
|
||||
|
||||
先初始化 Shell,再重启终端:
|
||||
|
||||
```bash
|
||||
conda init
|
||||
```
|
||||
|
||||
### 进入终端自动激活 base
|
||||
|
||||
如果不想每次打开终端都进入 `base` 环境:
|
||||
|
||||
```bash
|
||||
conda config --set auto_activate_base false
|
||||
```
|
||||
|
||||
恢复自动激活:
|
||||
|
||||
```bash
|
||||
conda config --set auto_activate_base true
|
||||
```
|
||||
|
||||
### 查看 Python 与 pip 来自哪个环境
|
||||
|
||||
```bash
|
||||
where python
|
||||
where pip
|
||||
```
|
||||
|
||||
Linux / macOS:
|
||||
|
||||
```bash
|
||||
which python
|
||||
which pip
|
||||
```
|
||||
|
||||
### 依赖冲突
|
||||
|
||||
优先新建干净环境,不要在旧环境里反复修:
|
||||
|
||||
```bash
|
||||
conda create -n newenv python=3.10
|
||||
conda activate newenv
|
||||
```
|
||||
@@ -26,6 +26,120 @@ bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
|
||||
|
||||
> 参考网站:https://zhuanlan.zhihu.com/p/24461370776
|
||||
|
||||
## 常用命令速查
|
||||
|
||||
:::tip 高频命令
|
||||
日常排查 Docker 问题时,优先看容器状态、日志、端口映射和磁盘占用。
|
||||
:::
|
||||
|
||||
### 容器
|
||||
|
||||
```bash
|
||||
# 查看正在运行的容器
|
||||
docker ps
|
||||
|
||||
# 查看所有容器,包括已停止的
|
||||
docker ps -a
|
||||
|
||||
# 启动 / 停止 / 重启容器
|
||||
docker start 容器名或容器ID
|
||||
docker stop 容器名或容器ID
|
||||
docker restart 容器名或容器ID
|
||||
|
||||
# 删除容器
|
||||
docker rm 容器名或容器ID
|
||||
|
||||
# 强制删除运行中的容器
|
||||
docker rm -f 容器名或容器ID
|
||||
```
|
||||
|
||||
### 镜像
|
||||
|
||||
```bash
|
||||
# 查看本地镜像
|
||||
docker images
|
||||
|
||||
# 拉取镜像
|
||||
docker pull 镜像名:版本
|
||||
|
||||
# 删除镜像
|
||||
docker rmi 镜像名或镜像ID
|
||||
|
||||
# 构建镜像
|
||||
docker build -t 镜像名:版本 .
|
||||
```
|
||||
|
||||
### 运行与进入容器
|
||||
|
||||
```bash
|
||||
# 后台运行容器,并映射端口
|
||||
docker run -d --name 容器名 -p 主机端口:容器端口 镜像名:版本
|
||||
|
||||
# 后台运行容器,并挂载目录
|
||||
docker run -d --name 容器名 -v 主机目录:容器目录 镜像名:版本
|
||||
|
||||
# 进入正在运行的容器
|
||||
docker exec -it 容器名或容器ID bash
|
||||
|
||||
# 如果容器内没有 bash,改用 sh
|
||||
docker exec -it 容器名或容器ID sh
|
||||
```
|
||||
|
||||
### 日志与排查
|
||||
|
||||
```bash
|
||||
# 查看容器日志
|
||||
docker logs 容器名或容器ID
|
||||
|
||||
# 实时查看容器日志
|
||||
docker logs -f 容器名或容器ID
|
||||
|
||||
# 查看容器端口映射
|
||||
docker port 容器名或容器ID
|
||||
|
||||
# 查看容器资源占用
|
||||
docker stats
|
||||
|
||||
# 查看 Docker 磁盘占用
|
||||
docker system df
|
||||
```
|
||||
|
||||
### Docker Compose
|
||||
|
||||
```bash
|
||||
# 启动 compose 服务
|
||||
docker compose up -d
|
||||
|
||||
# 停止并删除 compose 服务
|
||||
docker compose down
|
||||
|
||||
# 重新构建并启动
|
||||
docker compose up -d --build
|
||||
|
||||
# 查看 compose 服务日志
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
### 清理
|
||||
|
||||
:::warning 谨慎执行
|
||||
清理命令可能删除未使用的容器、镜像、网络和缓存。生产环境执行前先确认影响范围。
|
||||
:::
|
||||
|
||||
```bash
|
||||
# 删除所有已停止的容器
|
||||
docker container prune
|
||||
|
||||
# 删除未使用的镜像
|
||||
docker image prune
|
||||
|
||||
# 删除未使用的容器、镜像、网络和构建缓存
|
||||
docker system prune
|
||||
|
||||
# 更彻底清理,包括未被容器使用的镜像
|
||||
docker system prune -a
|
||||
```
|
||||
|
||||
## 脚本安装
|
||||
|
||||
### 对于基于Debian的系统(如Ubuntu、Debian)
|
||||
|
||||
@@ -1,339 +1,416 @@
|
||||
# Git(版本控制系统)
|
||||
|
||||
Git:https://git-scm.com/
|
||||
Git 是一个免费、开源的分布式版本控制系统,用来记录代码历史、多人协作和版本回退。
|
||||
|
||||
Git 是一个免费、开源的分布式版本控制系统,旨在以高效、快速的方式处理从小型到超大型的各种项目。
|
||||
|
||||
Git 的速度非常快,并且拥有庞大的生态系统,包括各种图形界面(GUI)、代码托管服务以及命令行工具。
|
||||
- 官网:https://git-scm.com/
|
||||
- 中文教程:https://git-scm.com/book/zh/v2
|
||||
|
||||
## 安装
|
||||
### windows
|
||||
|
||||
### Windows
|
||||
|
||||
下载安装包并按默认步骤安装:
|
||||
|
||||
```text
|
||||
https://git-scm.com/
|
||||
|
||||
### linux
|
||||
```bash
|
||||
sudo apt install git-all
|
||||
```
|
||||
> https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git
|
||||
|
||||
都可以使用 `git -v` 检验是否安装成功
|
||||
### Linux
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install git
|
||||
```
|
||||
|
||||
检查是否安装成功:
|
||||
|
||||
```bash
|
||||
git --version
|
||||
```
|
||||
|
||||
## 基础配置
|
||||
|
||||
查看当前配置:
|
||||
|
||||
## 配置
|
||||
查看当前配置
|
||||
```bash
|
||||
git config --list
|
||||
```
|
||||
|
||||
设置邮箱和用户名
|
||||
设置用户名和邮箱:
|
||||
|
||||
```bash
|
||||
git config --global user.name "你的用户名"
|
||||
git config --global user.email "你的邮箱"
|
||||
```
|
||||
|
||||
设置代理
|
||||
设置默认分支名:
|
||||
|
||||
```bash
|
||||
git config --global init.defaultBranch main
|
||||
```
|
||||
|
||||
设置代理:
|
||||
|
||||
```bash
|
||||
git config --global http.proxy http://127.0.0.1:7890
|
||||
git config --global https.proxy http://127.0.0.1:7890
|
||||
```
|
||||
|
||||
取消代理
|
||||
取消代理:
|
||||
|
||||
```bash
|
||||
git config --global --unset http.proxy
|
||||
git config --global --unset https.proxy
|
||||
```
|
||||
|
||||
## 核心概念
|
||||
|
||||

|
||||
|
||||
## 概念
|
||||

|
||||
Git 管理代码时,通常会经过四个位置:
|
||||
|
||||
Git 管理代码时,一般会经过这四个地方:
|
||||
- 工作区:放置代码的 目录/文件夹
|
||||
- 暂存区:就是相当于一个临时地方,将代码先放到这里
|
||||
- 本地仓库:电脑的正是仓库,就是相当于将代码正式放到了自己电脑的仓库中,保存代码的历史记录
|
||||
- 远程仓库:网络/云 上的仓库,方便和别人进行协作
|
||||
- 工作区:你正在编辑的目录和文件。
|
||||
- 暂存区:准备提交的改动。
|
||||
- 本地仓库:保存在电脑上的提交历史。
|
||||
- 远程仓库:GitHub、Gitee、GitLab 等代码托管平台。
|
||||
|
||||
可根据上面的图进行理解
|
||||
## 日常流程
|
||||
|
||||
:::tip 常用顺序
|
||||
写代码前先拉取,写完后查看状态、暂存、提交、推送。
|
||||
:::
|
||||
|
||||
## 基础操作
|
||||
```bash
|
||||
// 一般只有初始化仓库的时候才会用到
|
||||
git init
|
||||
|
||||
// 1.克隆远程仓库的代码
|
||||
git clone [url]
|
||||
|
||||
// 2.提交自己修改过的代码
|
||||
git add .
|
||||
git commit -m "注释"
|
||||
|
||||
// 3.拉取远程仓库的最新代码
|
||||
# 拉取远程最新代码
|
||||
git pull
|
||||
|
||||
// 4.将自己的修改推送到远程仓库
|
||||
git push origin master
|
||||
# 查看当前改动
|
||||
git status
|
||||
|
||||
# 查看具体修改
|
||||
git diff
|
||||
|
||||
# 暂存全部改动
|
||||
git add .
|
||||
|
||||
# 提交
|
||||
git commit -m "说明本次修改"
|
||||
|
||||
# 推送
|
||||
git push
|
||||
```
|
||||
|
||||
克隆远程仓库:
|
||||
|
||||
```bash
|
||||
git clone 仓库地址
|
||||
```
|
||||
|
||||
初始化本地仓库:
|
||||
|
||||
```bash
|
||||
git init
|
||||
```
|
||||
|
||||
## 分支
|
||||
|
||||
```bash
|
||||
# 查看本地分支
|
||||
git branch
|
||||
|
||||
# 查看本地和远程分支
|
||||
git branch -a
|
||||
|
||||
# 创建并切换分支
|
||||
git checkout -b feature/login
|
||||
|
||||
# 切换分支
|
||||
git checkout main
|
||||
|
||||
# 拉取远程分支
|
||||
git fetch
|
||||
|
||||
# 合并分支
|
||||
git merge feature/login
|
||||
|
||||
# 删除本地分支
|
||||
git branch -d feature/login
|
||||
|
||||
# 删除远程分支
|
||||
git push origin --delete feature/login
|
||||
```
|
||||
|
||||
也可以使用新版命令:
|
||||
|
||||
```bash
|
||||
git switch main
|
||||
git switch -c feature/login
|
||||
```
|
||||
|
||||
## 远程仓库
|
||||
|
||||
```bash
|
||||
# 查看远程仓库
|
||||
git remote -v
|
||||
|
||||
# 添加远程仓库
|
||||
git remote add origin 仓库地址
|
||||
|
||||
# 修改远程仓库地址
|
||||
git remote set-url origin 新仓库地址
|
||||
|
||||
# 首次推送并关联上游分支
|
||||
git push -u origin main
|
||||
```
|
||||
|
||||
## 撤销与恢复
|
||||
|
||||
:::warning
|
||||
撤销命令会改变工作区或提交历史。执行前先用 `git status` 和 `git diff` 确认当前状态。
|
||||
:::
|
||||
|
||||
### 撤销未暂存的文件修改
|
||||
|
||||
```bash
|
||||
git restore 文件名
|
||||
```
|
||||
|
||||
撤销当前目录所有未暂存修改:
|
||||
|
||||
```bash
|
||||
git restore .
|
||||
```
|
||||
|
||||
### 取消暂存
|
||||
|
||||
```bash
|
||||
git restore --staged 文件名
|
||||
```
|
||||
|
||||
取消全部暂存:
|
||||
|
||||
```bash
|
||||
git restore --staged .
|
||||
```
|
||||
|
||||
### 修改最后一次提交信息
|
||||
|
||||
```bash
|
||||
git commit --amend -m "新的提交说明"
|
||||
```
|
||||
|
||||
### 回退到某个提交
|
||||
|
||||
保留代码改动,只撤销提交记录:
|
||||
|
||||
```bash
|
||||
git reset --soft 提交ID
|
||||
```
|
||||
|
||||
撤销提交和暂存,但保留工作区改动:
|
||||
|
||||
```bash
|
||||
git reset --mixed 提交ID
|
||||
```
|
||||
|
||||
:::danger
|
||||
`git reset --hard` 会丢弃提交后的工作区改动,除非明确知道后果,否则不要使用。
|
||||
:::
|
||||
|
||||
## 临时保存改动
|
||||
|
||||
当前代码还没写完,但需要切换分支时,可以用 stash。
|
||||
|
||||
```bash
|
||||
# 保存当前改动
|
||||
git stash
|
||||
|
||||
# 查看保存列表
|
||||
git stash list
|
||||
|
||||
# 恢复最近一次保存,并从 stash 列表删除
|
||||
git stash pop
|
||||
|
||||
# 恢复最近一次保存,但保留 stash 记录
|
||||
git stash apply
|
||||
|
||||
# 删除最近一次 stash
|
||||
git stash drop
|
||||
```
|
||||
|
||||
## 标签
|
||||
|
||||
```bash
|
||||
# 创建标签
|
||||
git tag v1.0.0
|
||||
|
||||
# 推送标签
|
||||
git push origin v1.0.0
|
||||
|
||||
# 查看标签
|
||||
git tag
|
||||
|
||||
# 删除本地标签
|
||||
git tag -d v1.0.0
|
||||
|
||||
# 删除远程标签
|
||||
git push origin --delete v1.0.0
|
||||
```
|
||||
|
||||
## 命令速查表
|
||||

|
||||
|
||||
|
||||

|
||||
|
||||
## 子模块
|
||||
|
||||
主仓库就像一个指向子模块的“快捷方式”,它记录了子模块的位置和版本。子模块是一个独立的仓库,存自己的代码和历史,主仓库只知道子模块的位置,不会存实际代码内容。
|
||||
主仓库只记录子模块的仓库地址和具体提交版本,子模块本身仍然是一个独立仓库。
|
||||
|
||||
简单来说,它们是两个独立的仓库。推送代码时,应该先推送子模块的代码,再推送主仓库的代码,避免跟踪警告。如果你推送了子模块的修改,无论主仓库的代码有没有变化,都需要重新推送一次主仓库,以确保引用更新。
|
||||
:::tip
|
||||
修改子模块代码后,先进入子模块提交并推送,再回到主仓库提交子模块引用变化。
|
||||
:::
|
||||
|
||||
**添加子模块**
|
||||
### 添加子模块
|
||||
|
||||
```bash
|
||||
git submodule add <url> <path>
|
||||
```
|
||||
|
||||
例如:
|
||||
示例:
|
||||
|
||||
```bash
|
||||
git submodule add https://github.com/oneao/docusaurus code/docusaurus
|
||||
```
|
||||
|
||||
添加成功后会在主仓库根目录下生成 `.gitmodules` 文件,该文件内有子模块的信息
|
||||
添加后,主仓库会生成 `.gitmodules` 文件。
|
||||
|
||||
**初始化子模块并获取内容**
|
||||
|
||||
只使用
|
||||
### 初始化和更新子模块
|
||||
|
||||
```bash
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
需要想修改代码并提交,需要切换到指定的分支
|
||||
```bash
|
||||
git branch
|
||||
|
||||
git checkout master
|
||||
```
|
||||
|
||||
**拉取子模块代码**
|
||||
|
||||
先拉取主仓库代码
|
||||
### 拉取包含子模块的仓库
|
||||
|
||||
```bash
|
||||
git pull
|
||||
git clone --recurse-submodules 仓库地址
|
||||
```
|
||||
|
||||
再在主仓库位置更新子模块引用
|
||||
如果克隆时忘了加参数:
|
||||
|
||||
```bash
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
然后进入子模块位置
|
||||
```bash
|
||||
git pull
|
||||
```
|
||||
|
||||
**从主仓库中移除子模块**
|
||||
### 更新子模块到远程最新提交
|
||||
|
||||
```bash
|
||||
git rm --cached code/docusaurus
|
||||
|
||||
// 删除子模块文件夹(如果不需要),提交更改。
|
||||
git submodule update --remote --merge
|
||||
```
|
||||
|
||||
### 移除子模块
|
||||
|
||||
```bash
|
||||
git submodule deinit -f 子模块路径
|
||||
git rm -f 子模块路径
|
||||
```
|
||||
|
||||
然后提交 `.gitmodules` 和主仓库的变更。
|
||||
|
||||
## 常见问题
|
||||
|
||||
### push之前未pull
|
||||
### push 之前未 pull
|
||||
|
||||
报错信息:
|
||||
报错通常类似:
|
||||
|
||||
```bash
|
||||
D:\code\test\test1>git push origin master
|
||||
To http://192.168.1.189:8443/r/test.git
|
||||
! [rejected] master -> master (fetch first)
|
||||
error: failed to push some refs to 'http://192.168.1.189:8443/r/test.git'
|
||||
hint: Updates were rejected because the remote contains work that you do not
|
||||
hint: have locally. This is usually caused by another repository pushing to
|
||||
hint: the same ref. If you want to integrate the remote changes, use
|
||||
hint: 'git pull' before pushing again.
|
||||
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
|
||||
! [rejected] main -> main (fetch first)
|
||||
error: failed to push some refs
|
||||
```
|
||||
|
||||
解决方法:
|
||||
原因是远程仓库已有你本地没有的提交。先拉取,再推送:
|
||||
|
||||
```bash
|
||||
# 先拉取
|
||||
git pull
|
||||
# 后推送
|
||||
git push origin master
|
||||
git push
|
||||
```
|
||||
|
||||
**注意:** 不要强推,可能覆盖他人修改,一般用不到。
|
||||
如果产生冲突,先解决冲突,再提交和推送。
|
||||
|
||||
:::warning
|
||||
不要随意使用 `git push -f`,它可能覆盖他人的远程提交。
|
||||
:::
|
||||
|
||||
### 合并冲突
|
||||
|
||||
当多人修改同一文件的同一位置,Git 无法自动合并,会出现冲突标记:
|
||||
|
||||
```text
|
||||
<<<<<<< HEAD
|
||||
本地内容
|
||||
=======
|
||||
远程内容
|
||||
>>>>>>> 分支或提交ID
|
||||
```
|
||||
|
||||
处理步骤:
|
||||
|
||||
1. 打开冲突文件,保留正确内容,删除冲突标记。
|
||||
2. 暂存已解决的文件。
|
||||
3. 提交并推送。
|
||||
|
||||
```bash
|
||||
git push -f origin master
|
||||
git add 冲突文件
|
||||
git commit -m "解决冲突"
|
||||
git push
|
||||
```
|
||||
|
||||
### 合并冲突(修改同一文件)
|
||||
当 A 和 B 同时修改了同一文件的时候,本地文件和远程文件发生了冲突。Git 无法自动合并,需要你手动解决冲突。
|
||||
|
||||
例如:
|
||||
|
||||
```bash
|
||||
CONFLICT (content): Merge conflict in a.txt
|
||||
Automatic merge failed; fix conflicts and then commit the result.
|
||||
```
|
||||
|
||||
意思是:
|
||||
|
||||
- Git 在合并文件 `a.txt` 时,发现本地和远程对同一部分代码进行了修改;
|
||||
- 无法判断以哪一方为准,自动合并失败;
|
||||
- 需要你手动处理这个冲突。
|
||||
|
||||
解决方案:
|
||||
|
||||
1. 打开冲突的 `a.txt` 文件,查看里面的内容:
|
||||
|
||||
```
|
||||
<<<<<<< HEAD
|
||||
12 # 这里是 A 修改的
|
||||
=======
|
||||
1 # 这里是 B 修改的
|
||||
2
|
||||
>>>>>>> 6fe1e2d97eae79e0c5080ddea4bdef658841486d
|
||||
```
|
||||
|
||||
2. 手动修改内容,保留需要的部分。例如:
|
||||
|
||||
```
|
||||
12
|
||||
```
|
||||
|
||||
3. 添加修改后的文件:
|
||||
|
||||
```bash
|
||||
git add a.txt
|
||||
|
||||
git commit -m "解决 a.txt 冲突"
|
||||
|
||||
git push origin master
|
||||
```
|
||||
|
||||
### 修改文件但 git status 显示未修改
|
||||
|
||||
可能的原因:
|
||||
可能原因:
|
||||
|
||||
- 你改的是换行符(LF/CRLF)但内容没变;
|
||||
- 编辑器保存规则设置导致未检测到真实修改;
|
||||
- 文件编码问题或隐藏字符。
|
||||
- 只修改了换行符或编码。
|
||||
- 编辑器保存规则导致内容没有真正变化。
|
||||
- 改动发生在未被 Git 跟踪的目录。
|
||||
|
||||
解决方法:
|
||||
|
||||
- 用 `git diff` 检查是否真的修改了;
|
||||
- 也可以尝试先改点内容,再恢复,重新保存。
|
||||
|
||||
### 误删文件
|
||||
#### 文件误删并已 add
|
||||
误删了一个文件(比如 `b.txt`),然后执行了:
|
||||
|
||||
```bash
|
||||
git add a.txt
|
||||
```
|
||||
|
||||
- 这时候 Git **把删除操作加入暂存区**,等待 commit。
|
||||
- 文件还没有被 commit,但已经从工作区和暂存区记录为“删除”。
|
||||
|
||||
|
||||
|
||||
**查看哪些文件被误删**
|
||||
排查:
|
||||
|
||||
```bash
|
||||
git status
|
||||
git diff
|
||||
git ls-files 文件名
|
||||
```
|
||||
|
||||
示例输出
|
||||
### 误删文件
|
||||
|
||||
文件已被 Git 跟踪,但还没有提交删除时,可以恢复:
|
||||
|
||||
```bash
|
||||
Changes to be committed:
|
||||
(use "git restore --staged <file>..." to unstage)
|
||||
new file: a.txt
|
||||
|
||||
Changes not staged for commit:
|
||||
(use "git add/rm <file>..." to update what will be committed)
|
||||
(use "git restore <file>..." to discard changes in working directory)
|
||||
deleted: a.txt
|
||||
git restore 文件名
|
||||
```
|
||||
|
||||
|
||||
|
||||
**恢复文件**
|
||||
|
||||
这会把文件从暂存区移除,但 **不会恢复工作区文件**。
|
||||
如果删除已经被暂存,先取消暂存,再恢复:
|
||||
|
||||
```bash
|
||||
git restore --staged a.txt
|
||||
git restore --staged 文件名
|
||||
git restore 文件名
|
||||
```
|
||||
|
||||
这会把文件从最后一次 commit 的版本恢复到工作区。
|
||||
恢复当前目录下所有未提交的误删文件:
|
||||
|
||||
```bash
|
||||
git restore a.txt
|
||||
```
|
||||
|
||||
或者可以循环恢复多个误删文件:
|
||||
|
||||
```
|
||||
git restore --staged .
|
||||
git restore .
|
||||
```
|
||||
|
||||
> `git restore .` 会把所有误删且未 commit 的文件恢复。
|
||||
|
||||
#### 文件已 commit,误删未 add
|
||||
|
||||
场景说明
|
||||
|
||||
- 文件 **已经被 Git commit**(也就是之前已经被保存到版本历史中)
|
||||
- 你在工作区 **误删了该文件**
|
||||
- **还没有执行 `git add`**
|
||||
|
||||
> 这时候 Git 知道文件原本存在,但工作区已经缺失。
|
||||
|
||||
|
||||
|
||||
**查看被误删的文件**
|
||||
### 本地分支落后远程
|
||||
|
||||
```bash
|
||||
git fetch
|
||||
git status
|
||||
git pull
|
||||
```
|
||||
|
||||
示例输出:
|
||||
如果只是想查看远程有哪些更新:
|
||||
|
||||
```bash
|
||||
Changes not staged for commit:
|
||||
(use "git add/rm <file>..." to update what will be committed)
|
||||
deleted: a.txt
|
||||
git log --oneline --decorate --graph --all -20
|
||||
```
|
||||
|
||||
> 🔹 `deleted: a.txt` 就是被误删的文件。
|
||||
|
||||
**恢复误删文件(未 add)**
|
||||
|
||||
```bash
|
||||
git restore a.txt
|
||||
```
|
||||
|
||||
> 这会从 **最近一次 commit** 恢复文件到工作区。
|
||||
|
||||
|
||||
|
||||
**检查文件是否恢复成功**
|
||||
|
||||
```
|
||||
git status
|
||||
```
|
||||
|
||||
- 文件会出现在工作区
|
||||
- `git status` 不再显示 `deleted`
|
||||
|
||||
@@ -0,0 +1,230 @@
|
||||
# WSL2 部署教程+ 迁移 D 盘 + 权限配置全程无踩坑
|
||||
|
||||
适用场景:Windows10 2004+/Windows11 系统、AI开发、Linux环境开发、OpenClaw等工具部署
|
||||
|
||||
教程目标:默认WSL安装会占用C盘空间,本教程通过「临时安装-导出镜像-迁移非系统盘」方案,完整部署WSL2+Ubuntu22.04,全程无虚拟机、不占用C盘,适配所有开发场景。
|
||||
|
||||
环境优势:相比虚拟机、Windows原生环境,WSL2是AI开发、Linux开发的最优方案
|
||||
|
||||
## 一、为什么选择 WSL2 做开发环境?
|
||||
|
||||
在部署OpenClaw、深度学习框架、Linux服务等工具时,WSL2 对比传统Windows环境、VMware虚拟机有四大核心优势,也是目前开发者首选方案:
|
||||
|
||||
- 极致生态兼容:完美适配所有Linux专属AI框架、开发工具、命令脚本,解决Windows环境兼容性报错问题。
|
||||
- 原生级性能:基于真实Linux内核运行,文件IO、编译、运行性能接近原生Linux,远优于WSL1和虚拟机。
|
||||
- 无缝开发体验:打通Windows与Linux文件系统,可直接使用Linux命令行、Docker容器、编译工具,双系统无缝切换。
|
||||
- 支持GPU硬件加速:专属AI开发核心优势,可直接调用显卡算力,满足深度学习、模型训练需求。
|
||||
|
||||
## 二、WSL1与WSL2核心区别(必看)
|
||||
|
||||
WSL 分为两个版本,本教程全程使用WSL2(推荐),二者核心差异如下:
|
||||
|
||||
- WSL1:模拟Linux环境,无真实内核,兼容性差、不支持GPU加速,仅适合简单文件交互,不推荐开发使用。
|
||||
- WSL2:搭载完整Linux内核,虚拟化架构优化,性能拉满、兼容性100%,支持GPU加速、容器部署,是AI/后端开发首选版本。
|
||||
|
||||
## 三、前置准备条件
|
||||
|
||||
1. 系统版本:Windows10 2004及以上版本 / 全系Windows11
|
||||
2. 操作权限:全程使用管理员身份运行PowerShell
|
||||
3. 目录准备:提前在D盘创建文件夹 D:\\WSL(用于存放Ubuntu镜像,迁移非系统盘核心目录)
|
||||
|
||||
## 四、手把手完整安装部署步骤(全命令实操)
|
||||
|
||||
所有命令按顺序执行,无遗漏、无跳过,新手直接复制粘贴即可!
|
||||
|
||||
### 步骤1:开启Windows必备虚拟化功能
|
||||
|
||||
以管理员身份打开PowerShell,依次执行以下两条命令,开启WSL支持和虚拟机平台功能(WSL2运行必备依赖):
|
||||
|
||||
```bash
|
||||
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
|
||||
```
|
||||
|
||||
```bash
|
||||
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
|
||||
```
|
||||
|
||||
执行完成后,手动重启电脑,确保功能生效。
|
||||
|
||||
### 步骤2:更新WSL内核、设置默认版本
|
||||
|
||||
重启后再次打开管理员PowerShell,执行内核更新命令,修复WSL2运行依赖:
|
||||
|
||||
```bash
|
||||
wsl --update
|
||||
```
|
||||
|
||||
更新完成后,设置系统默认WSL版本为2,避免自动适配旧版本:
|
||||
|
||||
```bash
|
||||
wsl --set-default-version 2
|
||||
```
|
||||
|
||||
### 步骤3:查看可安装的Linux发行版
|
||||
|
||||
执行命令查看官方支持的系统镜像,确认Ubuntu-22.04可正常安装:
|
||||
|
||||
```bash
|
||||
wsl --list --online
|
||||
```
|
||||
|
||||
### 步骤4:临时安装Ubuntu22.04(C盘临时镜像)
|
||||
|
||||
WSL默认只能先安装到C盘,我们先安装纯净镜像,后续迁移至D盘,执行安装命令:
|
||||
|
||||
```bash
|
||||
wsl --install -d Ubuntu-22.04
|
||||
```
|
||||
|
||||
安装过程中会提示设置用户名和密码,务必牢记(密码输入无回显,正常输入即可)。
|
||||
|
||||
安装完成后,执行命令验证当前WSL状态:
|
||||
|
||||
```bash
|
||||
wsl -l -v
|
||||
```
|
||||
|
||||
若显示Ubuntu-22.04、版本为2,代表临时安装成功。
|
||||
|
||||
### 步骤5:关闭WSL实例,准备镜像导出
|
||||
|
||||
镜像导出前必须关闭运行中的Ubuntu进程,否则导出文件损坏,执行终止命令:
|
||||
|
||||
```bash
|
||||
wsl --terminate Ubuntu-22.04
|
||||
```
|
||||
|
||||
### 步骤6:导出Ubuntu镜像至D盘(核心迁移步骤)
|
||||
|
||||
将C盘临时安装的Ubuntu系统,完整打包为镜像文件,保存到D盘预设目录:
|
||||
|
||||
```bash
|
||||
wsl --export Ubuntu-22.04 D:\WSL\Ubuntu22.04.tar
|
||||
```
|
||||
|
||||
等待命令执行完成,D:\\WSL目录下会生成 Ubuntu22.04.tar 镜像文件。
|
||||
|
||||
### 步骤7:卸载C盘临时Ubuntu系统
|
||||
|
||||
镜像备份完成后,卸载C盘的临时安装文件,释放C盘空间:
|
||||
|
||||
```bash
|
||||
wsl --unregister Ubuntu-22.04
|
||||
```
|
||||
|
||||
### 步骤8:导入镜像至D盘(永久安装非系统盘)
|
||||
|
||||
执行导入命令,将D盘镜像重新部署,固定WSL2版本,彻底完成迁移:
|
||||
|
||||
```bash
|
||||
wsl --import Ubuntu-22.04 D:\WSL\ D:\WSL\Ubuntu22.04.tar --version 2
|
||||
```
|
||||
|
||||
参数说明:镜像名称 + 存放目录 + 镜像文件路径 + 指定WSL2版本
|
||||
|
||||
### 步骤9:进入系统,配置普通用户(安全优化)
|
||||
|
||||
导入完成后,默认以root超级管理员登录,为了系统安全,禁止日常使用root账号,需创建普通用户:
|
||||
|
||||
#### 1、进入Ubuntu系统:
|
||||
|
||||
```bash
|
||||
wsl -d Ubuntu-22.04
|
||||
```
|
||||
|
||||
#### 2、创建自定义用户名(替换为自己的用户名):
|
||||
|
||||
```bash
|
||||
sudo adduser 你的用户名
|
||||
```
|
||||
|
||||
#### 3、给新用户赋予sudo管理员权限,支持系统操作、安装软件:
|
||||
|
||||
```bash
|
||||
sudo usermod -aG sudo 你的用户名
|
||||
```
|
||||
|
||||
### 步骤10:设置默认登录用户,永久生效
|
||||
|
||||
在Ubuntu终端内执行命令,写入配置文件,设置自定义用户为默认登录账号:
|
||||
|
||||
```bash
|
||||
sudo -i
|
||||
```
|
||||
|
||||
```bash
|
||||
echo -e "[user]\ndefault=你的用户名" > /etc/wsl.conf
|
||||
```
|
||||
|
||||
配置完成后,退出当前系统:
|
||||
|
||||
```bash
|
||||
exit
|
||||
```
|
||||
|
||||
### 步骤11:重启WSL,验证全部配置
|
||||
|
||||
PowerShell中执行重启命令,让所有配置生效:
|
||||
|
||||
```bash
|
||||
wsl --shutdown
|
||||
```
|
||||
|
||||
再次查看WSL完整状态,确认系统路径、版本、用户正常:
|
||||
|
||||
```bash
|
||||
wsl -l -v
|
||||
```
|
||||
|
||||
## 五、最终使用方式
|
||||
|
||||
配置全部完成后,无需命令行启动,直接打开电脑开始菜单,搜索「Ubuntu 22.04」,点击即可直接进入配置好的非系统盘Linux环境,默认登录自定义普通用户。
|
||||
|
||||
## 六、常见问题避坑总结
|
||||
|
||||
- 导入镜像报错:检查D:\\WSL文件夹是否提前创建、路径是否无中文空格
|
||||
- 默认还是root登录:检查wsl.conf配置文件是否写入成功,执行wsl --shutdown重启生效
|
||||
- 功能开启失败:确认PowerShell为管理员权限,系统版本满足最低要求
|
||||
- 镜像导出失败:必须先terminate终止进程,否则文件占用导出异常
|
||||
|
||||
## 七、教程总结
|
||||
|
||||
本教程通过「临时安装-镜像导出-磁盘迁移-用户配置」全套流程,完美解决了WSL2默认占用C盘的痛点,全程保留WSL2的GPU加速、原生性能、生态兼容优势。部署完成后,可直接用于OpenClaw AI工具、深度学习开发、Linux服务部署、后端开发等所有场景,环境稳定、零卡顿、零兼容性问题。
|
||||
|
||||
## 附录
|
||||
|
||||
### 一、userdel -r 会删哪些东西
|
||||
|
||||
```bash
|
||||
sudo userdel -rf 用户名
|
||||
```
|
||||
|
||||
/etc/passwd、/etc/shadow、/etc/group 里的用户条目,
|
||||
用户家目录:/home/ 用户名 /(连同里面所有文件),
|
||||
邮件池:/var/mail/ 用户名、/var/spool/mail/ 用户名。
|
||||
|
||||
### 二、卸载安装的 Node.js
|
||||
|
||||
```bash
|
||||
# 1. 删除 node、npm、npx 可执行文件
|
||||
sudo rm -f /usr/local/bin/node
|
||||
sudo rm -f /usr/local/bin/npm
|
||||
sudo rm -f /usr/local/bin/npx
|
||||
|
||||
# 2. 删除核心库文件
|
||||
sudo rm -rf /usr/local/lib/node_modules
|
||||
sudo rm -rf /usr/local/include/node
|
||||
|
||||
# 3. 删除文档和手册
|
||||
sudo rm -rf /usr/local/share/man/man1/node*
|
||||
sudo rm -rf /usr/local/share/doc/node
|
||||
sudo rm -rf /usr/local/share/systemtap/tapset/node.stp
|
||||
|
||||
# 4. 删除用户缓存(可选但推荐)
|
||||
rm -rf ~/.npm
|
||||
rm -rf ~/.node-gyp
|
||||
```
|
||||
|
||||
## 参考来源
|
||||
|
||||
本教程参考自:[全网最细 WSL2 部署教程|Ubuntu22.04 迁移 D 盘 + 权限配置全程无踩坑](https://blog.csdn.net/weixin_43722052/article/details/161088690?spm=1001.2014.3001.5506)
|
||||
Reference in new issue
Block a user