虽然git用了很长时间,但是距离精通还是太远了。注意到虚拟环境是因为上传项目时用到的系统是macOS,而拉取项目时用到的系统是win,意识到是时候学习知识了(好懒啊)。
不上传虚拟环境
头一次上传:使用.gitignore避免虚拟环境被上传
然后将 .venv
添加到 .gitignore(在
项目根目录创建)
,确保 Git 以后不会再追踪它。
echo ".venv/" >> .gitignore
git add .gitignore
git commit -m "Ignore virtual environment"
同样,.gitignore还可以写不能上传到git的大文件的路径
如果你之前commit过,之后可以直接git push origin branch_name
已上传虚拟环境的项目更改成不再上传虚拟环境
对于已上传虚拟环境的项目,即使上传了.gitignore,还是有可能被追踪.venv(虚拟环境)
执行以下命令,让 Git 忽略已经被跟踪的 .venv
目录:
git rm -r --cached .venv
解释:
--cached
选项表示 只从 Git 索引中移除,不会删除本地文件。
如果 .venv
仍然存在于历史提交中
即使 .gitignore
和 git rm -r --cached .venv
生效,你的 .venv
可能已经在之前的提交历史中,这会导致 GitHub 仍然检测到大文件。
如果你想 彻底删除 .venv
相关的历史记录,可以使用 git filter-branch
或 BFG Repo-Cleaner
:
git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch .venv' --prune-empty --tag-name-filter cat -- --all
详细解析
1. git filter-branch
git filter-branch
是一个强大的 Git 命令,它允许你在 整个 Git 历史 上进行修改,比如重写提交、删除文件等。
2. --force
强制执行 git filter-branch
,即使 Git 之前警告这个命令已经被弃用(推荐使用 git filter-repo
)。
3. --index-filter 'git rm -r --cached --ignore-unmatch .venv'
这个部分是核心,它告诉 Git 在 所有提交历史 中执行 git rm -r --cached .venv
,即:
git rm -r --cached .venv
:递归地从索引(暂存区)中删除.venv
,但不会影响本地文件。--ignore-unmatch
:如果.venv
文件不存在,不会报错。
⚠️ 这个操作不会影响 本地的 .venv
文件,但它会让 Git 认为 .venv
从未存在过。
4. --prune-empty
如果某个提交 只包含 .venv
(即 .venv
是唯一的修改),那么删除 .venv
后,这个提交就变成空提交。--prune-empty
选项可以 删除这些空提交,保持 Git 历史的整洁。
5. --tag-name-filter cat
这个选项确保 Git 的 tag(标签)不会受到影响,仍然保留 tag 信息。
6. -- --all
--all
作用是:
- 让这个操作应用到 所有分支(不仅仅是当前分支)。
--
这个符号用于告诉 Git,后面的是文件路径或分支名,避免混淆。
更现代的替代方法
⚠️ Git 官方不推荐 git filter-branch
,建议使用 git filter-repo
。
至此,再次推送就可以了
不拉取虚拟环境
你可以使用 git clone
时的 排除特定文件 方法,或者在拉取(pull)时保留 .vscode
文件,具体方法如下:
方法 1:在 git clone
之后恢复 .vscode
步骤:
- 备份 你的
.vscode
文件夹:cp -r .vscode .vscode_backup
- 克隆项目:
git clone <repo_url>
- 恢复
.vscode
文件:mv .vscode_backup .vscode
方法 2:使用 git sparse-checkout
(仅适用于 Git 2.25+)
如果你不想拉取 .vscode
目录,可以使用 sparse-checkout
选择性拉取文件。
步骤:
- 克隆仓库但不检查出文件:
git clone --no-checkout <repo_url> my_project cd my_project
- 启用 sparse-checkout:
git sparse-checkout init --cone
- 排除
.vscode
:echo "!.vscode" >> .git/info/sparse-checkout
- 拉取剩余文件:
git checkout
方法 3:使用 git pull --rebase
并恢复 .vscode
如果你 已经克隆了仓库 并修改了 .vscode
,但想拉取更新时不覆盖 .vscode
,可以用:
git stash push .vscode # 备份 .vscode
git pull --rebase # 拉取最新代码
git stash pop # 恢复 .vscode
这样 .vscode
文件不会被覆盖。
方法 4:将 .vscode
加入 .git/info/exclude
如果你不希望 .vscode
目录被 Git 管理,你可以:
echo ".vscode" >> .git/info/exclude
这样 Git 就不会跟踪 .vscode
,即使拉取时它在远程仓库中也不会被覆盖。
结论
- 如果你还没有克隆仓库,推荐 方法 1 或 方法 2。
- 如果你已经克隆了,但不想覆盖
.vscode
,推荐 方法 3。 - 如果你想让 Git 永远忽略
.vscode
,可以用 方法 4。