项目多人协作开发一般都要用到版本管理工具并配置代码仓库服务器,这里根据网上资料汇总并实操修改整理出了源码包编译安装git,ssh涉服务端操作免密以及盘点一些git常用操作
一:源码包安装git
从官网或者镜像网站下到源码包,这里给一个镜像网站,里边找到想要的git-版本号.tar.gz
https://mirrors.edge.kernel.org/pub/software/scm/git/
先校准系统时间,若时间差太多则过程中将会产生报错
以下操作需要先切换超管权限。
此处解压到下载下了,所以来到这里,你把源码包解压在哪就cd到哪,注意要cd到里边一大堆文件的那一级目录下
sudo su
#找到解压的路径
cd /解压路径/git-2.45.2/
编译安装
make configure
./configure --prefix=/usr/git
make profix=/usr/git
make install
加入环境变量
echo "export PATH=$PATH:/usr/git/bin" >> /etc/profile
echo "export PATH=$PATH:/usr/git/bin" >> /home/用户名/.profile
映射上传接受包
ln -s /usr/git/bin/git-upload-pack /usr/bin/git-upload-pack
ln -s /usr/git/bin/git-receive-pack /usr/bin/git-receive-pack
配置git命令tab自动补全
cp contrib/completion/git-completion.bash /home/用户名
echo "source ~/git-completion.bash" >> /home/用户名/.bashrc
重启
完成-检查版本
git --version
显示git version 2.45.2
设置用户名和git邮箱,不设置则无法操作,没啥特殊要求的话邮箱随便写,姓名最好就写成真名毕竟是给开发组看的,每个提交版本的信息都会附上邮箱号
git config --global user.email "姓名@xxx.com"
git config --global user.name "姓名"
文件管理器打开“显示隐藏文件”,方便辨别是否git仓库
二:配置局域网ssh涉服务端操作免密
若要配置git涉及服务端(本文所说的服务器或服务端其实就是局域网下作为代码仓库的机器,当然也可以是任何局域网下的机器,不是云服务器)操作免输入密码则需要ssh密钥,按以下步骤配置:
1:在本地生成ssh钥匙对,在任意地方打开终端输入命令
ssh-keygen -t rsa -C "你的git邮箱" #输git config --global user.email查看复制git邮箱
此命令会询问三个问题,若之前没有生成过ssh密钥,直接三个回车就行。
第一个问题:是存在哪,会给一个默认目录(home/当前账户/.ssh/)
第二个问题:接下来若上一步指定的目录已存在密钥则第二个问题会询问是否覆盖。若你确认已存在的密钥就是你git邮箱的密钥则不用管直接回车或者输入n再回车即可退出生成。若不是但仍想生成则先退出需要再别的地方找个文件夹并在下次输入命令生成密钥问你生成在哪时指定到此文件夹
若生成位置没有已存在的密钥则第二个问题会问是否设置ssh密码,咱要实现的是ssh git操作免密,这一步也是直接回车
第三个问题:重复输入密码,也直接回车
2:将公钥推送到服务器,来到.ssh,或者你指定的生成目录,没有指定目录的话普通用户默认生成在home/账户/.ssh/。
cd /home/用户名/.ssh/#或你之前生成ssh密钥时指定的目录
ssh-copy-id -i id_rsa.pub 服务器url(服务器用于git的账号名@服务器IP地址,如kylin@192.168.0.1)
若一般用sudo命令执行git,想配置超管账号对git服务端免密,则有不同,因为ssh密钥是对应着账号的,需要切换超管在执行:
1:切换超管来以root账号进行ssh密钥生成
sudo su -
2:在本地生成ssh钥匙对
ssh-keygen -t rsa -C “你的git邮箱”
3:将公钥推送到服务器,来到.ssh,root用户默认在root根目录的.ssh/,也就是在root的根目录直接输入cd .ssh就到了
cd .ssh
ssh-copy-id -i id_rsa.pub 服务器url(如kylin@192.168.0.1)
执行完这两步,就可以在git涉服务端操作中不用输入服务端密码了。当然sudo的话还是要输入本地账户验证密码的
三:git常用操作及讲解
打开终端输入查看是否安装成功
git --version
若安装成功,需要设置git用户信息,这里一般设置为姓名缩写,邮箱字段写什么字母都行。不设置则无法执行提交操作
若是局域网操作,则邮箱无所谓,若是需要联动github.gitee之流则最好用互联网邮箱
git config --global user.email "xxx@xxx.com"
git config --global user.name "姓名缩写"
如
git config --global user.email “WRT@git.com”
git config --global user.name “WRT”
后续输入不带字符串的此命令就可以查看当前设置的用户信息
git config --global user.email
WRT@git.com
git config --global user.name
WRT
git结构:
若使用git init初始化了一个git仓库,这个仓库就是标准的git仓库,标准的git仓库由工作区,暂存区和版本库构成。如我前面所说我打开了显示隐藏文件,所以可以看到.git文件夹,不打开则看不到
进入.git就可以看到git版本库的目录。不过这里一般情况下没必要动。若是你建立了一个裸仓库(后边会讲),里边的东西都跟此差不多,毕竟都是git存储版本的库
点击文件管理器右上角三道杠然后点显示隐藏文件即可看见.git
本地版本操作:
在某个目录下的终端初始化一个普通git仓库
git init
当文件修改完后,(在已经有文件的文件夹也可以直接init,无所谓仓库初始化在修改文件前还是后)在有.git的那一级打开终端将目录下文件添加到暂存区
git add .
.意味着仓库里的所有文件进行版本操作,比对并保存至暂存区,也可以指定路径仅保存部分文件
.意味着将所有文件进行添加暂存区操作,也可以输成路径仅指定部分文件。
然后提交到版本库,-m可在后边添加说明。后边若涉及push(推送到裸仓库)操作需要先commit再push,因为push本质上是推送版本而不是当前文件。若不加-m添加说明还会进入文字编辑器让你输入说明在提交(不写说明还想直接提交?哼!)
git commit -m "说明文字字符串"
查看历史版本及对应的版本号编码
git log
为某版本添加标签
git tag "标签内容" 版本号编码(不写默认当前版本)
回溯版本
git reset --hard 版本号编码/tag
开发软件中一般也可以使用git图形化菜单,但功能可能会相对有限,如qt,在菜单栏-工具中可以找到,若是sudo起的qt可能需要之前安装配置操作使用rootj进行以及用root去git configxx设置用户名和邮箱。
qt的git菜单栏,需要打开配置成仓库的工程或者在建立工程时添加到版本控制系统:Git,或者不是仓库的工程点击create respository(建立仓库了)就可以使用
这里提交文件直接点commit就行,在出来的对话框里可以选择更改的文件
分支概念:
一个仓库可以有多个分支,不同分支下可以分别进行版本管理。若不指定,新仓库第一次提交会创建名为master的分支
若不需要不同分支操作也可以不建新分支。若不需要可以不用,不新建分支的话默认分支叫master
git branch #查看所有分支,若没有建立分支或者提交过文件,执行此命令则什么也不会发生
git branch 要新建的分支名 #新建一个分支
git branch -d 分支名 #移除分支
git checkout 分支名 #切换到某分支
git merge 分支名 #将其他分支合并到当前分支
共享仓库:
若要建立共享仓库则需要建立裸仓库,工程仓库添加子模块也需要使用裸仓库来实现。裸仓库里边的文件与标准git仓库下的.git文件夹中内容差不多,但用途不完全一样。
git init --bare 裸仓库名称.git(为了方便区分,以.git结尾,虽然不加.git也能建裸仓库,但不容易与普通仓库或者文件夹区分)
裸仓库不包含工作区,毕竟这是专门用于共享的仓库,若要对裸仓库内的版本库进行管理,需要在裸仓库以外的目录下进行克隆操作,克隆出来的就是一个标准的git仓库,文件修改完后按照标准仓库的操作步骤(add,commit)提交到这个克隆仓库的版本库,然后推送到克隆仓库对应的裸仓库
若在.git目录下看到.gitmodules文件则说明存在子模块,若有子模块需要再初始化子模块否则克隆过来的仓库的对应目录会是空的,具体可以看下边子模块操作
若配置了ftp(比如使用filezella),可以ftp连接服务器站点来便捷的查看需要克隆的仓库所在的位置(在客户端输入url时文件路径是没法按服务端的路径tab补全的)。
也可以直接在终端使用ssh命令连接服务端使用终端去看ssh 账户名@IP地址
输入后再输入密码即可远程连接到服务端使用终端执行指令,此时就可以cd到指定路径去看你需要找的裸仓库地址。
按之前说的规定(为了方便辨认,建立裸仓库要以.git结尾),以xxx.git
结尾的目录就是裸仓库,纯.git只是某仓库的一部分不能克隆。
例:克隆服务器的/mnt/hgfs/gitdir/test.git仓库:
git clone kylin@192.168.0.1:/home/kylin/gitdir/test.git #git clone url(账户名@IP地址:/裸仓库文件夹路径)
在克隆仓库中将文件修改完后执行前面说的本地提交后使用此命令将当前克隆仓库的版本库推送到对应裸仓库,分支名不写就是推送到当前默认跟踪的分支。
git push 分支名(不写则是当前跟踪的分支)
从对应裸仓库拉取当前最新的代码并合并到本地克隆仓库工作区
git pull
从对应裸仓库拉取最新的代码但不合并到本地克隆仓库工作区
git fetch
将一个普通仓库设置为某个裸仓库的对应仓库以及子模块的建立:
若存在一种情况,每人负责不同的插件,想要在子模块更新时不直接影响主工程,则可以吧工程仓库底下的某个插件的文件夹设置为子模块进行版本管理
需要服务器下某目录建立一个用于当子模块的裸仓库
(服务端添子模块本质上是将子模块的裸仓库克隆到指定位置下,若命名与插件文件夹命名不一致还需要改名,所以方便起见这个裸仓库命名要以该插件文件夹加上.git命名。并且若裸仓库建立在各自的板子上,则如果哪天有客户端的电脑调走了,则主仓库的克隆仓会无法从该电脑上更新作为子模块的仓库,所以个人理解建议子模块的裸仓库放在服务器下的某非仓库目录里,负责对应插件的也往对应插件的裸仓库推送更新)
子模块操作:将工程底下的插件文件夹init为一个仓库,然后使用remote add命令将这个子模块的仓库连接到服务端那个对应的裸仓库并把插件提交然后推送过去。例如:一个插件文件夹名为MsgTrans
服务端在某目录比如home/kylin/pluginsGit下建了MsgTrans.git裸仓库
cd /home/kylin/pluginsGit
git init --bare MsgTrans.git
对应负责人电脑:
cd /工程路径/MsgTrans
git init
git add .
git commit -m “初始提交说明”
git remote add origin mic@192.168.0.1:/home/kylin/pluginsGit/MsgTrans.git origin是添加远程仓库的命名,不一定非叫origin
git push -u origin master #首次提交需要跟踪分支,后续若不涉及当前不跟踪的新建分支则仅输入git push即可
后续更新推送仅使用git push就行。
如果是把一个没有提交过文件的仓库进行remote add 操作,则会在git push --set-upstream origin master环节报错。因为push要将本地分支跟踪远程分支的,本地没有提交过版本也就没有可用分支,若当前插件还没有任何文件,可以先随便建个文件然后提交再首次推送。
remote add 不会检查url可达性,后续push或者别的操作才会检查是否可达。
若需要删除仓库与某个裸仓库的连接。使用
git remote remove origin #origin是要删除的远程仓库连接的名字,在remote add时设置的
工程仓库添加子模块:
在工程仓库的克隆仓库下,找到该插件所在的目录,执行。添加子模块时即使是本地的裸仓库,url也不能只使用文件路径。添加后会自动创建子模块裸仓库的同名文件夹(不带.git)。若此时目录下已有该目录需要处理命名冲突。
若该目录就是这个插件但对应的作为子模块的裸仓库还是空的,还没推送,可以这样做
1先进入该插件文件夹git init然后add,commit,再remote add,push -u到之前在服务端建的子模块裸仓库完成子模块内容的推送
2然后删掉或者移走该插件文件夹并到主工程仓库目录下提交一下当前删掉插件的版本(仅删除文件夹不提交则会在submodule add时会报已在索引中)再到那个插件所在的目录下添加该子模块(因为添加子模块和update子模块都会克隆子模块仓库)
cd 工程中插件所在的那一级目录
git submodule add kylin@192.168.0.1:/home/kylin/pluginsGit/MsgTrans.git
被添加成了子模块的仓库在主仓库更新子模块或者添加完子模块自动克隆过来后底下的.git将不再是目录而是一个保存了目录信息的名为.git的文档
回到工程根目录仓库
git push
此时就完成了工程仓库子模块的添加并更新到代码仓了
子模块本质上是指向另一个裸仓库的指针,子模块裸仓库本身的更新不会自动往父仓库更新。子模块裸仓库本身是不知道自己变成了某仓库的子模块的,所以父仓库更新子模块的版本需要父仓库执行命令完成
因为子模块跟父仓库联系不紧密,所以若添加完子模块后,在别处克隆了父仓库,子模块虽然会有文件夹但里边不会有文件,需要更新子模块
git clone 父仓库.git
cd 父仓库
git submodule init
git submodule update#此时子模块数量越多,越能体现出ssh免密的含金量了()
此时才会挨个更新对应的子模块。
后两条命令也可以用一条git submodule update --init --recursive
代替
若在此之后子模块有修改,需要在主仓库下获取更新
git submodule foreach git pull
git submodule foreach本质上就是向当前仓的所有子仓库挨个执行一条命令
git submodule foreach git push -u origin master#将当前克隆仓库的子模块挨个推送