【git】已上传虚拟环境的项目更改成不再上传虚拟环境/拉取除虚拟环境以外的项目

虽然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 仍然存在于历史提交中

即使 .gitignoregit rm -r --cached .venv 生效,你的 .venv 可能已经在之前的提交历史中,这会导致 GitHub 仍然检测到大文件。

如果你想 彻底删除 .venv 相关的历史记录,可以使用 git filter-branchBFG 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

步骤:
  1. 备份 你的 .vscode 文件夹:
    cp -r .vscode .vscode_backup
    
  2. 克隆项目
    git clone <repo_url>
    
  3. 恢复 .vscode 文件
    mv .vscode_backup .vscode
    

方法 2:使用 git sparse-checkout(仅适用于 Git 2.25+)

如果你不想拉取 .vscode 目录,可以使用 sparse-checkout 选择性拉取文件。

步骤:
  1. 克隆仓库但不检查出文件
    git clone --no-checkout <repo_url> my_project
    cd my_project
    
  2. 启用 sparse-checkout
    git sparse-checkout init --cone
    
  3. 排除 .vscode
    echo "!.vscode" >> .git/info/sparse-checkout
    
  4. 拉取剩余文件
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值