目的为了实现在本地编辑代码,服务器跑代码。
通过github,实现本地代码和服务器代码同步,结果同步。
数据备份,不丢失。
举例说明一下:
Mac:本地笔记本电脑,用于编辑代码。 Server:远程服务器,有显卡,用于跑model。
第一步:在Mac上修改代码,上传到自己的github。
第二步:在Server上先同步github(包括结果上传,代码更新),跑model。
第三步:在Mac上同步github,就能看到结果。
如此循环即可。
这样本地-GitHub-服务器,代码数据是保持一致的(除了最新的一点点),相当于有3个备份。如果任意一端崩溃了,都可以快速进行恢复,影响极小。
ps:在家跑实验,服务器崩溃了几次只好采用了这种结构,都是心酸呀。通过脚本,上述的步骤其实很方便的就能完成,不用担心。
方案一:前提要求Mac和Server上都安装了git(是自带的,可以进行覆盖)
有自己的github账户,建立了自己的Reponsitories。
为了方便说明,
设定自己的GitHub账户名:newlei。对应的账号: newlei@gmail.com 密码为: password
设定自己的Reponsitories名字叫:MyReponsitories。二:下载MyReponsitories仓库到本地
github下载仓库到本地很简单,一行命令即可:
git clone https://github.com/newlei/MyReponsitories.git
就会自动下载到本地,文件夹名也是MyReponsitories了。
三:代码同步-脚本
由于MAC和Server上都涉及到上传数据到github和从github下载数据,所以任务是一致的,脚本自然也是一致的。话不多说,直接上脚本代码,将脚本放到上一步的文件夹MyReponsitories里面,并命名为autoSyn.sh。
#!/bin/shgit status
git add *
git commit -m 'add some code from Mac'
# git commit -m 'add some results from Server'
git pull --rebase origin master #domnload data
git push origin master #upload data
git stash pop
这就是主要的部分了,不需要进行修改,直接使用即可。会同步更新,自行合并代码,不会造成覆盖等问题。
其中git commit -m 'add some code from Mac'里面的话可以自己修改,是给此次提交代码添加说明的。
ps:可以为Mac和Server各自写一个脚本也是可以的,因为需求不同,后面也有设置不同的例子
四:运行脚本
执行bash autoSyn.sh就可以运行上述脚本了。(在Linux和Mac上可行的,在win系统中需要自己设置保证能够运行bash文件)
五:只输入一次账户密码
在运行autoSyn.sh脚本的时候,每次都会让你输入账户和密码,比较麻烦。有只输入一次的设置,直接先上命令行进行说明。
git config --global credential.helper store # save forever
git config --global credential.helper 'cache --timeout=3600' # save 3600s,then you need input username and password again
上述的2种方式,第一种会保存账户密码,不需要在输入了,第二种只保存3600秒,之后还需要输入。更多说明
这一步还是有的糊涂对不对,会有疑问在哪里输入密码呢。
先输入上面的命令行,记住先输入上面的命令行,接着再MyReponsitories文件夹里面,然后运行脚本会让你输入账户密码。这样你只需要输入这一次,后续再运行autoSyn.sh脚本,就不需要输入密码了。
六:一些问题解决方案第一次用commit会有错误, 输入下面的命令行即可解决。
git config --global user.email "newlei@gmail.com"
里面的newlei@gmail.com 换成自己的邮箱即可
在运行脚本中遇到
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.
这是由于git pull --rebase origin master这行指令导致的,一些解决方案是我已经加入脚本中,不用担心,我说一下我这里遇到的特殊情况。如果你允许autoSyn.sh脚本还是遇到,可以参考一下。
我在文件夹MyReponsitories里面会不停的写入文件,这就导致了,git status 之后其实本地仓库还是改变了,那么就出现了不一致,所以报错You have unstaged changes。说你还有一些改变,你没有说明怎么处理,这时候不知道咋解决了。就不回同步更新你的本地仓库了。
既然原因知道了,那就简单,不要不停的写入文件即可
删除文件,这个在脚本里面没有涉及。如果需要可以在脚本里面加入:
git rm **这样就可以删除文件了。七:Server脚本进阶
前面第三步中设置的Mac和Server脚本是一致的。这里给个进阶的用法。
我们可以发现在Server中不仅需要同步代码,还需要跑model,那么之前的autoSyn.sh脚本就不够了,只有同步代码,既然问题出现了,我们很自然的可以把跑model的命令也加入到脚本中去。
由于我是用python写代码,所以跑model就是以python **.py为例。
#!/bin/shgit status
git add *
git commit -m 'add some code from Mac'
# git commit -m 'add some results from Server'
git pull --rebase origin master #domnload data
git push origin master #upload data
git stash pop
sleep 3s #Just for more stable, you can remove this.
python **.py
这样在同步代码之后,就会自动运行python命令,去跑model了。
当然了,你会说,我不是没次都行跑python命令,有时候只是想更新代码,不用慌,如下:
#!/bin/shgit status
git add *
git commit -m 'add some code from Mac'
# git commit -m 'add some results from Server'
git pull --rebase origin master #domnload data
git push origin master #upload data
git stash pop
sleep 3s #Just for more stable, you can remove this.
if [ -n "$1" ]; then
echo 'just syn code and results ----'
else
echo "syn and run code"
python TrainFairness.py
fi
如果需要运行python命令:bash audoSyn.sh
如果只更新代码:bash audoSyn.sh 0,后面的0,可以任意值都行,代码里面并没有处理,只要判断有参数就行。