这篇文章主要讲讲如何自动将本地文件保存到GitHub上
有人会好奇,为什么我要将本地文件保存到GitHub上呢?其实我的理由就只有一个:不知道为什么我的Typora有时候会出现无法响应的情况(直接卡死),这样可能会导致写了很久的内容会丢掉。
鸡蛋在前阵子也计划写文章,我看他写了两个星期的文章,在某一天告诉我:Typora的文件坏了,怎么修复阿。
![fdfb4d5e99111c364b519c60bf8ee73a.png](https://i-blog.csdnimg.cn/blog_migrate/2776f73260bb42da6caf4ee90434edb7.jpeg)
最终的结果就是他写了两周的东西就这样丢了。
有的人看到这里可能就会说:谁让你不用云笔记的产品,自动同步到云,用云笔记的会有这种事吗?
这话也说得在理,只是Typora实在是好用(不单单是Typora,也有很多的好用产品只支持本地,没有同步云的功能)。
于是,我就打算定时将Typora的内容上传到Github,以免出现鸡蛋的那种情况。
电脑环境:Mac 10.15.2
这篇是入门的文章,你全当是Git+Crontab的入门教程就好了!
一、为什么GitHub?
GitHub我就默认大家都知道它是什么东西了,我写过的文章都会收录到GitHub,方便我后续的查阅:
![df0133c3668c72495190ff47307a6775.png](https://i-blog.csdnimg.cn/blog_migrate/007160486d98f1b79cebf6ba0601d218.jpeg)
如果关注GitHub的同学会知道:GitHub给我们提供了免费的私有仓库(在以前都是公开仓库)。
![8f041950cc9b91095a42f9785612dbab.png](https://i-blog.csdnimg.cn/blog_migrate/49dd484d8254fb7044914b41929ea12c.jpeg)
于是我们可以将自己不想公开的内容放到私有的仓库上。
我将本地的文件同步到GitHub的原因有两个:
现在GitHub支持私有仓库
Git作为程序员多多少少都会懂一些,而且它是真的方便。
二、动手
在动手之前,我们能猜想到:想要定时将本地保存到GitHub上,知识点大概有以下:
懂一点点GitHub(拥有自己的GitHub账号,创建一个私有仓库)
懂一点点Git命令(有Git环境)
懂一点点Shell(定时脚本执行Git命令上传)
![87c702104beabb0b189ccafad60c5e96.png](https://i-blog.csdnimg.cn/blog_migrate/78807240b11b4a3ca7c337bf1b3131ed.jpeg)
2.1 创建一个私有仓库
如何注册GitHub,在GitHub创建一个私有仓库,这里我就不多讲了。鼠标点点,就完成了
![c0cb482597646d7bff205af2d854d830.png](https://i-blog.csdnimg.cn/blog_migrate/af439b776fe20aaa0eac46d6328abd1c.jpeg)
2.2 将本地文件上传到GitHub仓库
首先,我要把我的笔记目录作为Git可以管理的仓库,我的文件夹的名字叫做markdown
![66f61b28a9b6c4f16a53c17ae96eb245.png](https://i-blog.csdnimg.cn/blog_migrate/6888bf2933aed029b728a646d8b52de6.jpeg)
于是我将markdown目录变成Git可以管理的仓库
![681caaa04edf6bf00e84a51ad0a53649.png](https://i-blog.csdnimg.cn/blog_migrate/673e55771f4f4c9c6f79ef80dfd6683f.jpeg)
先试试能不能把本地的文件push到GitHub,所以我们先add
一下
![2e27712a1e6e8e0a7cf87914eeb03aea.png](https://i-blog.csdnimg.cn/blog_migrate/f48909155e404673d1067ec30939fdc0.jpeg)
然后commit
一下
![a7304858fdd4f009f666fe9d4c06645a.png](https://i-blog.csdnimg.cn/blog_migrate/cdf0d94a57e4e9192d1e7676767fa922.jpeg)
在push之前,我们需要看看自己的机器有没有跟GitHub仓库关联起来(一般第一次都没有),首先我们需要创建SSH Key。于是我们可以执行
ssh-keygen -t rsa -C "youremail@example.com" --(引号的是自己的账号邮箱)
![150dda7395f1d5f885332f4473214ecd.png](https://i-blog.csdnimg.cn/blog_migrate/d78da346355a66f666c5b5720ee225fc.jpeg)
期间我们一路回车就好了,执行完之后,我们可以到用户主目录找到.ssh
目录
![b90fe235661e1fd401126fae27e27ebd.png](https://i-blog.csdnimg.cn/blog_migrate/d46ef79afe0a2c507b2ee69ed5ab246d.jpeg)
去.ssh
目录找出公钥的文件id_rsa.pub
![0258ed182fb7270b328c42da47cc61b9.png](https://i-blog.csdnimg.cn/blog_migrate/feb28616b4a3f022e73f6a9ca1a5b780.jpeg)
将公钥的信息去GitHub上复制对应的内容就好了。对应的GitHub地址是:https://github.com/settings/keys
![0d1112921cc827d41ba74dd36990771d.png](https://i-blog.csdnimg.cn/blog_migrate/399dc0f1af16ce4ea568903ded563dad.jpeg)
然后我们就将本地仓库与GitHub仓库关联起来:
git remote add origin git@github.com:ZhongFuCheng3y/markdown.git
![d3972e3ba0403319079b60fa89f776ca.png](https://i-blog.csdnimg.cn/blog_migrate/1a1144f08397f431cf519cfa16048d8a.jpeg)
![925d93393e83028f2deb980586dbbc13.png](https://i-blog.csdnimg.cn/blog_migrate/1bd9b775e5ab11c48a0f84a687dfabeb.jpeg)
关联了以后,我们就可以将本地仓库push到远程仓库了
git push -u origin master
执行以后你可能会发现,出错了。push不上去,错误如下:
![ac924dfa74fba2c88ed77e2d812a3efa.png](https://i-blog.csdnimg.cn/blog_migrate/cbf08259fead94a166dcfd67bb08bd9a.jpeg)
我们要先把远程仓库的readme同步到本地仓库中,使用命令:
git pull --rebase origin master
![41de199fc945670a2b257eb148e92548.png](https://i-blog.csdnimg.cn/blog_migrate/9eb7ed98859076be36e03dff9b1a663c.jpeg)
完了以后,我们就可以看到已经把远程仓库的readme同步到本地了:
![2593c6fa911cdd53d6e1eaa59ee8cbca.png](https://i-blog.csdnimg.cn/blog_migrate/9c871d032c1c9244e21721bf4b1ad0d4.jpeg)
然后我们再执行push命令将本地文件push到远程仓库中:
git push -u origin master
![1b0e098476cba25fd3e25ba7c47fa038.png](https://i-blog.csdnimg.cn/blog_migrate/338afefad3ec064b72e8fb12109f648a.jpeg)
去GitHub的仓库一看,就可以发现已经将本地文件同步到GitHub上了:
![c6d0eb8e0bac39826bd7dd7ed574d1f0.png](https://i-blog.csdnimg.cn/blog_migrate/a736c750816604dbdaf673be232c0bbd.jpeg)
2.3 写脚本自动定时上传
首先,我们编写一个脚本文件,这个脚本非常简单,内容如下:
#
其实就是将上面的命令再写一次,然后我们就有了这个脚本了。我给这个脚本取名autoSave.sh
。
接着,给这个脚本增加权限(为了方便我直接就是chmod 777
)
![afc738fce78cb22911e8381b778be7f6.png](https://i-blog.csdnimg.cn/blog_migrate/b826d4c3f810310806b1663da2eaf6b2.jpeg)
有了脚本以后,我们就可以将这个脚本放到crontab
上执行,在mac上使用crontab
非常方便。我们现在只需要记住两个命令:
crontab -e --编辑crontab
crontab -l --查看crontab的命令
ok,于是我们就可以写crontab命令了。这里是非常简单的,只要我们懂一点点cron表达式
就好了,如果不懂也没关系,百度:“cron 在线生成器” 你就可以随自己喜好的时间去调用了。
![61812527457492b9c18b60009f75a6a9.png](https://i-blog.csdnimg.cn/blog_migrate/6df23e8afbfe67efd5598ac4cedc4fef.jpeg)
于是我就写出了以下的cron表达式:
* * * * * /Users/3y/autoSave.sh > ~/b.txt 2>&1 &
完了以后,我们执行crontab -l
就发现这条命令再crontab中了:
![d01765951cdeed89e85754f6d6e57411.png](https://i-blog.csdnimg.cn/blog_migrate/05341e16a68822518e42307793c1f397.jpeg)
解释一下这条命令:
* * * * *
标志我这行命令需要在每分钟执行一次/Users/3y/autoSave.sh
标志我的脚本位置(这里需要用绝对路径)> ~/b.txt 2>&1 &
将脚本执行后的结果 输入到b.txt
文件上
完成!我们就可以看到每分钟都会将本地的文件内容上传到GitHub上了
调试完成后,我们就可以将日志输出到/dev/null
![a6f09c4b24a8856ea5dd6985990196b8.png](https://i-blog.csdnimg.cn/blog_migrate/1b05faa15a55f6f8bcd33be18c6d8306.jpeg)
2.3.1 可能会遇到的坑
在将命令最开始写到crontab时,我是没有打印执行的结果的。发现没有调用成功,排查了好久都没排查出来(一度怀疑是不是我的电脑crontab有问题)…
我当时还写了另一段脚本去看一下我的crontab有没有问题,再后来才把执行的结果写到文件上的
执行一段程序也好,一段脚本也好,在最编写的时候一定要打日志
期间也遇到过奇奇怪怪的坑,这里列一下,希望后续的人看到我这篇文章能解决掉相似的问题:
脚本写完,记得加上可执行的权限
保存crontab的时候,遇到
"/usr/bin/vi" exited with status 1
,可以尝试把crontab的进行杀掉,再重新启动。或者在.zshrc
添加export EDITOR=vim
如果在输出的结果上遇到Operation not permitted,把iTerm加上完全磁盘访问权限
打开mac的系统偏好设置 〉安全性与隐私〉隐私〉完全磁盘访问权限,加入iTerm然后勾选就行了
文件属性带有
@
,不要把脚本和文件夹放在Download
目录下,Mac在执行crontab时会有奇奇怪怪的权限问题。
2.4 这次用到的命令
crontab服务:
开启:sudo /usr/sbin/cron start
重启:sudo /usr/sbin/cron restart
停止:sudo /usr/sbin/cron stop
编写crontab:crontab -e
查看crontab:crontab -l
杀死进程:
kill -9 pid
Git相关命令:
参考廖雪峰Git教程撸一下就可以了:
https://www.liaoxuefeng.com/wiki/896043488029600
最后
这篇文章主要是用Mac
来讲解如何将本地文件自动同步到GitHub的,很多同学就会想:大哥,我用的是Windows,你给我讲Mac有啥用阿?
Mac能实现的,Windows也能实现,只不过方式和手段可能存在一点点区别而已,有兴趣的同学可以去折腾一下。