前言
最近用的服务器加了一个堡垒机,不能直接用ssh访问(所有相关的都不行,比如vscode、pycharm巴拉巴拉),同时服务器也没办法访问GitHub。但是这些实验在我的破笔记本又跑不起来,无奈之下只好暂时掏出之前玩饥荒买的服务器,来暂时做git的仓库。在实际使用时期望的步骤是:
- 本地vscode修改代码,然后直接commit&push到远程仓库中
- 服务器从远程仓库pull,然后通过cmd运行
tips: 其实不一定要一个服务器作为仓库,因为是只有自己在用,在本地开一个远程仓库也是可以的(搭完才发现)。
步骤
Git下载和安装
对于本地的windows,我参考了mukes在博客中的描述。不过他的介绍有点长,嫌麻烦可以按照这个步骤简化一下:
- 在这里下载Git for windows的安装包:git-scm.com
- 一路默认设置(特别是有红色字体的部分,强烈建议默认设置)
仓库服务器B和要跑实验的服务器A都要安装git,参考了git社区文档(以ubuntu为例):
sudo apt install git-all
特别地,对于仓库服务器,我们最好开一个新的账户用于保存.git文件(别给root权限)。假设在root中:
# 在创建账户的过程中,我们为git设置了一个主目录,就放在/home/git吧
adduser git
配置git仓库
对于每一个刚刚安装的git,我们需要先进行一些初步的配置:
git config --golbal user.name "myname"
git config --golbal user.email "myemail"
# 修改文本编辑器,默认为vim(非必要)
git config --golbal core.editor vim
假设我们在用于跑代码的服务器A已经有一个project,我们可以先生成一个裸仓库:
# 进入到对应的project
cd my_project
# 初始化一个仓库
git init
# git add用于添加需要更新的文件,如果有数据集等请避免跟踪那些文件
# 有一个文件可以管理不跟踪文件的模式
# but我的数据集是分离的所以没有认真研究
git add .
# 查看相对于初始化仓库时的暂存修改
git status
# 提交修改到仓库中
git commit -m 'initial project version'
前面已经为project建立了一个仓库,现在我们想要把这个仓库克隆到服务器中。如果22或者443端口出入站都是没问题的,那我们直接使用clone就可以啦。eg,在用于保存代码的中转服务器B中:
mkdir /home/git
cd /home/git
git clone user@A:/.../.../myproject
但是我就是因为22端口不能入站才选择用git的,相同情况的话我们要在A中设置一个裸仓库:
cd /.../.../myproject
git init --bare myproject.git
# 通过scp将裸仓库复制到仓库服务器B中
scp myproject.git git@B:/home/git
B必须要有公网ip。我们可以将B上裸仓库clone到本地:
git clone git@B:/home/git/myproject.git
这样一来,服务器A、B和本地都有了一个相同的副本,我们就可以以B为桥梁,开心(非)实验了。
Git的一些基本操作
先说一下,Git管理文件时,文件状态的变化情况:
一个通过git init
的目录下的所有文件,一开始都是属于untracked状态的。处于untracked和modified状态的文件想要提交都需要经历一个staged的状态。而所有staged的文件在提交之后都会变成unmodified的状态。我们在本地修改和提交的时候,最经常经历的情况就是:
- 新建文件
- 修改或删除文件
无论哪一种情况,我们都可以通过git add "file or folder"
的命令来将对应的修改放到staged区(实际使用中也可以不手动放到暂存区,而是通过git commit -a
直接将修改合并到本地仓库,但是这样就要先设置好untracked的规则)。
在修改提交到本地仓库后,可以通过git push
进一步将更改合并到远程仓库中。在任何时候我们都可以通过git status
来检查本地project的状态。
tips: git push
可以提交是因为我们通过clone复制工程时也保存了远程仓库的链接但是也有一些特殊的时候。比如说前面scp复制后就不会自动链接到服务器。这个时候我们可以通过:
git remote add origin git@B:/home/git/myproject.git
链接远程仓库。
而对于用于跑实验的服务器A。我们主要是需要拉取修改和提交,这个时候就可以用git pull
来拉取对应的修改,并且和本地的分支合并。