Mac 本地文件夹与 GitHub 仓库一键同步完整教程

面向零基础用户,从 GitHub 空仓库创建、本地 Git 初始化、首次推送,到编写 push.sh 一键同步脚本,完整梳理 Mac 文件夹和 GitHub 仓库的干净同步闭环。

这篇文章适合完全没用过 Git 的 Mac 用户。目标很简单:准备一个本地文件夹,把想同步的文件都放进去,以后运行一个脚本,就能自动提交并推送到 GitHub。

最终效果是:

/Users/mana/Documents/codex/file/   本地同步文件夹
git@github.com:hanigege/file.git    GitHub 远程仓库
push.sh                             一键同步脚本

日常只需要做两件事:

cd /Users/mana/Documents/codex/file
./push.sh

脚本会先从 GitHub 拉取远程更新,再检查本地文件变化,最后自动提交并推送。

准备工作

Mac 上需要先具备 Git 和 SSH 访问 GitHub 的能力。

先在终端检查 Git:

git --version

如果系统提示安装 Command Line Tools,按提示安装即可。安装完成后,再运行一次 git --version 确认 Git 可用。

然后确认当前 Mac 能通过 SSH 连接 GitHub:

ssh -T git@github.com

如果看到类似 successfully authenticated 的提示,说明 SSH 已经配置好。这里不要求进入远程 shell,GitHub 只需要确认你的密钥身份。

在 GitHub 创建空仓库

打开 GitHub 网站,点击右上角的 +,选择 New repository

仓库名称填写:

file

创建时保持仓库完全空白,不要勾选:

Add a README file
Add .gitignore
Choose a license

这样做的原因是:第一次同步由本地文件夹发起,远程仓库保持空白,可以避免 README、license 或远程 .gitignore 和本地首次提交产生不必要的冲突。

创建完成后,复制 SSH 地址:

git@github.com:hanigege/file.git

如果你的 GitHub 用户名或仓库名不同,把后面的命令里的地址替换成你自己的 SSH 地址。

创建本地同步文件夹

打开 Mac 的 Terminal,创建并进入本地目录:

mkdir -p /Users/mana/Documents/codex/file
cd /Users/mana/Documents/codex/file

初始化 Git 仓库:

git init

把默认分支改成 main

git branch -M main

关联 GitHub 远程仓库:

git remote add origin git@github.com:hanigege/file.git

检查远程地址是否写对:

git remote -v

正常会看到 origin 同时出现在 fetch 和 push 两行里。

创建忽略文件

Mac 会在文件夹里产生 .DS_Store 这类系统缓存文件。一键同步脚本本身也不一定需要上传到仓库,所以先创建 .gitignore

cat << 'EOF' > .gitignore
.DS_Store
push.sh
EOF

这里的含义是:

.DS_Store   忽略 Mac Finder 缓存文件
push.sh     忽略本地一键同步脚本本身

如果你希望把脚本也同步到 GitHub,就删除 .gitignore 里的 push.sh 这一行。

已经误上传的文件怎么移除

如果 .DS_Storepush.sh 已经出现在 GitHub 仓库里,单独把它们写进 .gitignore 还不够。

原因是 Git 的忽略规则只对“还没有被追踪”的文件生效。只要文件之前已经被 git addgit commitgit push 过,它就已经进入版本追踪;后来再写进 .gitignore,Git 仍然会继续追踪它。

这时要用 git rm --cached--cached 的意思是:只从 Git 版本追踪里删除,不删除本地真实文件。

在本地同步目录运行:

cd /Users/mana/Documents/codex/file
git rm --cached .DS_Store push.sh
git commit -m "Fix: remove trash files from remote repository"
git push origin main

执行完成后,刷新 GitHub 仓库页面,.DS_Storepush.sh 就会从远程仓库消失;本地目录里的 push.sh 仍然保留,可以继续运行。

以后因为 .gitignore 已经写好了这两个文件,即使再次执行:

./push.sh

它们也不会再被 git add . 上传。

首次提交并推送

先把 .gitignore 加入暂存区:

git add .gitignore

提交:

git commit -m "Initial commit with gitignore"

推送到 GitHub,并建立本地 main 和远程 main 的追踪关系:

git push -u origin main

这一步成功后,本地文件夹和 GitHub 仓库已经建立了第一条干净同步记录。

创建一键同步脚本

继续在 /Users/mana/Documents/codex/file 目录里创建 push.sh

cat << 'EOF' > push.sh
#!/bin/bash

# 切到脚本所在目录,避免从别的路径执行时同步错目录。
cd "$(dirname "$0")" || exit 1

# 确认当前目录是 Git 仓库。
if [ ! -d ".git" ]; then
    echo "错误: 当前目录不是一个 Git 仓库。"
    exit 1
fi

current_branch=$(git branch --show-current)

if [ -z "$current_branch" ]; then
    echo "错误: 当前没有有效分支。"
    exit 1
fi

echo "正在检查远程仓库更新..."
git pull origin "$current_branch" --rebase
if [ $? -ne 0 ]; then
    echo "错误: 自动合并远程更新失败,请先手动解决冲突。"
    exit 1
fi

if [ -z "$(git status --porcelain)" ]; then
    echo "没有发现本地文件变动,当前已经与远程同步。"
    exit 0
fi

echo "检测到文件变动:"
git status -s
echo "----------------------------------------"

echo "开始同步到 GitHub..."
git add .

commit_message="Update: $(date '+%Y-%m-%d %H:%M:%S')"
git commit -m "$commit_message"
if [ $? -ne 0 ]; then
    echo "错误: 提交失败。"
    exit 1
fi

git push origin "$current_branch"
if [ $? -eq 0 ]; then
    echo "----------------------------------------"
    echo "一键推送成功,分支: $current_branch"
else
    echo "----------------------------------------"
    echo "错误: 推送失败,请检查网络或 GitHub SSH 权限。"
    exit 1
fi
EOF

给脚本加执行权限:

chmod +x push.sh

因为前面的 .gitignore 忽略了 push.sh,所以这个脚本只保留在本机,不会被 git add . 上传。

日常怎么用

以后把需要同步的文件或文件夹放进:

/Users/mana/Documents/codex/file

需要同步时运行:

cd /Users/mana/Documents/codex/file
./push.sh

脚本会自动完成这些动作:

1. 切到同步文件夹
2. 检查当前目录是不是 Git 仓库
3. 获取当前分支名
4. 执行 git pull --rebase 对齐远程
5. 检查本地有没有新增、修改或删除
6. 自动 git add .
7. 自动生成带时间的 commit
8. 推送到 GitHub

常见问题

提示 remote origin already exists

说明这个目录之前已经设置过远程仓库。先查看当前远程地址:

git remote -v

如果地址不对,可以改成新的:

git remote set-url origin git@github.com:hanigege/file.git

推送时提示 Permission denied

通常是 GitHub SSH key 没配置好。先测试:

ssh -T git@github.com

如果认证失败,需要先在 Mac 上生成 SSH key,并把公钥添加到 GitHub 的 SSH keys 页面。

pull –rebase 提示冲突

这说明本地和 GitHub 上都改过同一个位置,Git 不知道应该保留哪一边。脚本会停止,避免强行覆盖。

此时先查看冲突文件:

git status

打开冲突文件,按实际内容保留正确版本,然后执行:

git add .
git rebase --continue
git push origin main

如果你不确定怎么解决,不要乱删冲突标记,先备份文件内容再处理。

没有变化时会不会产生空提交

不会。脚本里有这一段检查:

if [ -z "$(git status --porcelain)" ]; then
    echo "没有发现本地文件变动,当前已经与远程同步。"
    exit 0
fi

没有新增、修改或删除时,脚本会直接退出。

最终检查

完成配置后,可以用下面三条命令检查状态:

git status
git branch -vv
git remote -v

理想状态是:

工作区干净
当前分支是 main
main 正在追踪 origin/main
origin 指向你的 GitHub SSH 仓库地址

到这里,Mac 本地文件夹和 GitHub 仓库的一键同步闭环就完成了。