自動將本地檔案儲存到GitHub
前言
只有光頭才能變強。
文字已收錄至我的GitHub精選文章,歡迎Star:https://github.com/ZhongFuCheng3y/3y
這篇文章主要講講如何自動將本地檔案儲存到GitHub上
有人會好奇,為什麼我要將本地檔案儲存到GitHub上呢?其實我的理由就只有一個:不知道為什麼我的Typora有時候會出現無法響應的情況(直接卡死),這樣可能會導致寫了很久的內容會丟掉。
雞蛋在前陣子也計劃寫文章,我看他寫了兩個星期的文章,在某一天告訴我:Typora的檔案壞了,怎麼修復阿。
最終的結果就是他寫了兩週的東西就這樣丟了。
有的人看到這裡可能就會說:誰讓你不用雲筆記的產品,自動同步到雲,用雲筆記的會有這種事嗎?
這話也說得在理,只是Typora實在是好用(不單單是Typora,也有很多的好用產品只支援本地,沒有同步雲的功能)。
於是,我就打算定時將Typora的內容上傳到Github,以免出現雞蛋的那種情況。
電腦環境:Mac 10.15.2
這篇是入門的文章,你全當是Git+Crontab的入門教程就好了!
一、為什麼GitHub?
GitHub我就預設大家都知道它是什麼東西了,我寫過的文章都會收錄到GitHub,方便我後續的查閱:
如果關注GitHub的同學會知道:GitHub給我們提供了免費的私有倉庫(在以前都是公開倉庫)。
於是我們可以將自己不想公開的內容放到私有的倉庫上。
我將本地的檔案同步到GitHub的原因有兩個:
- 現在GitHub支援私有倉庫
- Git作為程式設計師多多少少都會懂一些,而且它是真的方便。
二、動手
在動手之前,我們能猜想到:想要定時將本地儲存到GitHub上,知識點大概有以下:
- 懂一點點GitHub(擁有自己的GitHub賬號,建立一個私有倉庫)
- 懂一點點Git命令(有Git環境)
- 懂一點點Shell(定時指令碼執行Git命令上傳)
2.1 建立一個私有倉庫
如何註冊GitHub,在GitHub建立一個私有倉庫,這裡我就不多講了。滑鼠點點,就完成了
2.2 將本地檔案上傳到GitHub倉庫
首先,我要把我的筆記目錄作為Git可以管理的倉庫,我的資料夾的名字叫做markdown
於是我將markdown目錄變成Git可以管理的倉庫
先試試能不能把本地的檔案push到GitHub,所以我們先add
一下
然後commit
一下
在push之前,我們需要看看自己的機器有沒有跟GitHub倉庫關聯起來(一般第一次都沒有),首先我們需要建立SSH Key。於是我們可以執行
ssh-keygen -t rsa -C "[email protected]" --(引號的是自己的賬號郵箱)
期間我們一路回車就好了,執行完之後,我們可以到使用者主目錄找到.ssh
目錄
去.ssh
目錄找出公鑰的檔案id_rsa.pub
將公鑰的資訊去GitHub上覆制對應的內容就好了。對應的GitHub地址是:https://github.com/settings/keys
然後我們就將本地倉庫與GitHub倉庫關聯起來:
git remote add origin [email protected]:ZhongFuCheng3y/markdown.git
關聯了以後,我們就可以將本地倉庫push到遠端倉庫了
git push -u origin master
執行以後你可能會發現,出錯了。push不上去,錯誤如下:
我們要先把遠端倉庫的readme同步到本地倉庫中,使用命令:
git pull --rebase origin master
完了以後,我們就可以看到已經把遠端倉庫的readme同步到本地了:
然後我們再執行push命令將本地檔案push到遠端倉庫中:
git push -u origin master
去GitHub的倉庫一看,就可以發現已經將本地檔案同步到GitHub上了:
2.3 寫指令碼自動定時上傳
首先,我們編寫一個指令碼檔案,這個指令碼非常簡單,內容如下:
#!/bin/bash
cd /Users/3y/markdown
git add .
git commit -m "java3y auto save"
git push -u origin master
其實就是將上面的命令再寫一次,然後我們就有了這個指令碼了。我給這個指令碼取名autoSave.sh
。
接著,給這個指令碼增加許可權(為了方便我直接就是chmod 777
)
有了指令碼以後,我們就可以將這個指令碼放到crontab
上執行,在mac上使用crontab
非常方便。我們現在只需要記住兩個命令:
crontab -e --編輯crontab
crontab -l --檢視crontab的命令
ok,於是我們就可以寫crontab命令了。這裡是非常簡單的,只要我們懂一點點cron表示式
就好了,如果不懂也沒關係,百度:“cron 線上生成器” 你就可以隨自己喜好的時間去呼叫了。
於是我就寫出了以下的cron表示式:
* * * * * /Users/3y/autoSave.sh > ~/b.txt 2>&1 &
完了以後,我們執行crontab -l
就發現這條命令再crontab中了:
解釋一下這條命令:
* * * * *
標誌我這行命令需要在每分鐘執行一次/Users/3y/autoSave.sh
標誌我的指令碼位置(這裡需要用絕對路徑)> ~/b.txt 2>&1 &
將指令碼執行後的結果 輸入到b.txt
檔案上
完成!我們就可以看到每分鐘都會將本地的檔案內容上傳到GitHub上了
除錯完成後,我們就可以將日誌輸出到/dev/null
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也能實現,只不過方式和手段可能存在一點點區別而已,有興趣的同學可以去折騰一下。
我在寫這篇文章之前,我也不知道Mac的crontab會遇到這麼多的問題,也花了我不少的時間去解決。對於這些問題,我也不懂。但是我們可以去找方案,找解決的辦法,最終還是可以完成的。
可能你會看到我的終端花花綠綠的,我用的是iTerm+一系列外掛
組成的(Mac),想要對應的教程的同學可以在公眾號下回復“工具”即可獲取
看完這篇文章的同學可能會有很多話想說,因為crontab+指令碼可以完成一系列有趣的東西,不妨在評論區留言你用crontab做了什麼有趣的事?
參考資料:
crontab無法執行指令碼原因及解決方法
- macOS中使用crontab教程以及問題解決辦法
- 每日自動將你的網站備份到Github 告別資料丟失
- Linux定時任務Crontab命令詳解
crontab 指令碼錯誤日誌和正確的輸出寫入到檔案
本已收錄至我的GitHub精選文章,歡迎Star:https://github.com/ZhongFuCheng3y/3y
樂於輸出乾貨的Java技術公眾號:Java3y。公眾號內有300多篇原創技術文章、海量視訊資源、精美腦圖,關注即可獲取!
非常感謝人才們能看到這裡,如果這個文章寫得還不錯,覺得「三歪」我有點東西的話 求點贊 求關注️ 求分享