# Visual Studio 中使用 Git

这篇记录 Visual Studio 里使用 Git 管理 Obsidian 笔记库的流程。

当前笔记库路径：

```text
%USERPROFILE%\OneDrive\Apps\remotely-save\MyNotes
```

GitHub 远程仓库：

```text
https://github.com/Ki5ter/Obsidian.git
```

## VS 里的几个设置不要混淆

`默认位置 Default location`：
不是当前正在工作的仓库路径。它只是 Visual Studio 以后 clone 新仓库时默认放到哪里。

推荐设置成类似：

```text
%USERPROFILE%\GitRepos
```

不推荐设置成：

```text
%USERPROFILE%\OneDrive\Apps\remotely-save\MyNotes
```

原因是 `MyNotes` 本身就是一个仓库，不应该再作为所有新仓库的默认存放目录。

`Git 全局配置 Git Global Config`：
影响电脑上所有 Git 仓库，比如用户名、邮箱、全局代理。

`Git 仓库配置 Git Repository Config`：
只影响当前打开的这个仓库，比如当前仓库的 `origin` 地址。

`远程库 Remotes`：
配置当前本地仓库对应的远程仓库地址。常见写法：

```text
Name: origin
URL: https://github.com/Ki5ter/Obsidian.git
```

## 第一次使用的正确流程

1. 在资源管理器中找到笔记库文件夹：

```text
%USERPROFILE%\OneDrive\Apps\remotely-save\MyNotes
```

2. 如果笔记库在 OneDrive 里，先右键文件夹，选择：

```text
始终保留在此设备上
```

3. 用 Visual Studio 打开文件夹：

```text
文件 -> 打开 -> 文件夹
```

4. 打开 `Git 更改` 窗口。

5. 如果还不是 Git 仓库，选择创建 Git 仓库，或者用命令：

```powershell
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" init
```

6. 在当前仓库的远程库里添加：

```text
Name: origin
URL: https://github.com/Ki5ter/Obsidian.git
```

7. 在 `Git 更改` 窗口输入提交信息，例如：

```text
Initial Obsidian notes backup
```

8. 点击 `全部提交`。

9. 点击 `推送`。

## 提交和推送的区别

`全部提交`：
只是把改动提交到本地仓库。提交成功后，GitHub 上还不会有变化。

`推送`：
把本地提交上传到 GitHub 远程仓库。

如果 VS 显示：

```text
2 传出
```

意思是本地有 2 个 commit 还没有推送到远程仓库。

## 本地分支名 master 和 main

有些仓库默认分支叫 `master`，GitHub 新仓库常见默认分支叫 `main`。

如果本地当前是 `master`，可以直接推送：

```powershell
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" push -u origin master
```

如果想改成 `main`：

```powershell
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" branch -M main
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" push -u origin main
```

## 不建议提交 .vs 目录

Visual Studio 会在仓库里生成 `.vs/` 目录，用来保存本机缓存、索引、窗口布局等内容。

这些文件通常只和当前电脑有关，不适合推送到 GitHub。建议在 `.gitignore` 中加入：

```gitignore
/.vs/
```

如果 `.vs/` 已经被 Git 跟踪过，需要取消跟踪但保留本地文件：

```powershell
git rm --cached -r -- ".vs"
git commit -m "Stop tracking Visual Studio local files"
git push
```

## Clash Verge 代理问题

如果推送时报错：

```text
Failed to connect to 127.0.0.1 port 10809
```

说明 Git 被配置成使用 `127.0.0.1:10809` 代理，但 Clash Verge 没有在这个端口提供服务。

当前 Clash Verge 配置中常见端口：

```text
mixed-port: 7897
socks-port: 7898
port: 7899
```

推荐让 Git 使用 `mixed-port`：

```powershell
git config --global http.proxy http://127.0.0.1:7897
git config --global https.proxy http://127.0.0.1:7897
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" config http.proxy http://127.0.0.1:7897
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" config https.proxy http://127.0.0.1:7897
```

然后再推送：

```powershell
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" push -u origin master
```

或者回 Visual Studio 里点击 `推送`。

如果不想让 Git 走代理，可以清除代理：

```powershell
git config --global --unset http.proxy
git config --global --unset https.proxy
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" config --unset http.proxy
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" config --unset https.proxy
```

## TUN 虚拟网卡模式

TUN 或虚拟网卡模式可以让更多系统流量进入代理，理论上也可能让 Git 不需要单独设置代理。

但它不是解决 Git 推送问题的第一选择，因为它会涉及管理员权限、DNS、路由和规则匹配。

当前场景更推荐：

```text
Clash Verge 正常运行
Git 的 http.proxy / https.proxy 指向 Clash Verge 的 mixed-port
VS 中正常点击推送
```

## 常见排查命令

查看当前仓库状态：

```powershell
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" status --short --branch
```

查看远程仓库：

```powershell
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" remote -v
```

查看分支：

```powershell
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" branch -vv
```

查看最近提交：

```powershell
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" log --oneline --decorate -5
```

查看 Git 代理：

```powershell
git config --global --get-regexp "http.*proxy|https.*proxy"
git -C "E:\Obsidian\OneDrive\Apps\remotely-save\MyNotes" config --get-regexp "http.*proxy|https.*proxy"
```

## OneDrive 注意事项

如果出现下面这些错误：

```text
not a git repository
Permission denied
The cloud file provider is not running
unable to access .git/info/exclude
```

优先检查 OneDrive 是否正在运行，以及笔记库是否已经设置为：

```text
始终保留在此设备上
```

Git 仓库里的 `.git` 目录不要只存在云端占位。`.git` 目录读不到时，Visual Studio 会无法刷新仓库设置，也可能无法提交或推送。

