这篇文章适合完全没用过 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_Store 或 push.sh 已经出现在 GitHub 仓库里,单独把它们写进 .gitignore 还不够。
原因是 Git 的忽略规则只对“还没有被追踪”的文件生效。只要文件之前已经被 git add、git commit、git 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_Store 和 push.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 仓库的一键同步闭环就完成了。