GIT在Linux上的安装和使用简介


 


GIT最初是由Linus Benedict Torvalds为了更有效地管理Linux内核开发而创立的分布式版本控制软件,与常用的版本控制工具如CVS、Subversion不同,它不必服务器端软件支持,速度和效率也有着相当程度的提高。


  www.2cto.com  


如果拥有CVS或者SVN的使用背景,那么更熟悉的方法是客户端-服务器端模式,所有的文件仓库(repository)都是存放在服务器上的,用户需要在本地安装客户端去服务器上的项目中获取旧版本,提交新版本。


 


GIT抛弃了这种模式,当用户从远端GIT仓库下载一个工程(project)时,这个工程的所有文件,包括版本历史,文件改动都会下载下来,这时 候本地GIT就演变成了一个服务器,所有的提交(check-in)、提出(check-out)都会在这个本地服务器上执行,当你确定一项修改之后,可 以再和远端仓库进行合并和同步(merge)。所以,GIT的安装和配置步骤无论在本机还是服务器上都是完全一样的。


 


这里简单地介绍GIT在Linux上的安装和使用,算做一个新手入门的简单教程。另外,GIT是有Windows上的客户端的。


1、下载和安装GIT


从这里 http://git-scm.com/download 下载GIT或者使用wget命令获取


 


$ cd


$ wget http://kernel.org/pub/software/scm/git/git-1.7.6.tar.bz2


 


以上地址若是无法下载到的话


 


解压后切换到其目录


  www.2cto.com  


$ tar xvfj git-1.7.6.tar.bz2


$ cd git-1.7.6


 


使用默认配置进行安装,如果想修改配置,可以使用 ./configure --help 来获取帮助


 


$ ./configure


$ make


$ make install


 


2、初始化配置


GIT默认安装在 /usr/local/bin ,安装之后可以验证一下是否安装好


 


$ whereis git


git: /usr/local/bin/git


$ git  --version


git version 1.7.6


$ git  --help


 


首先需要指定用户名和电子邮件地址


 


$ git config  --global user.name “GIT Admin”


$ git config  --global user.emal obugs.net@gmail.com


 


再验证一下配置信息


  www.2cto.com  


$ git config  --list


user.name=GIT Admin


user.email=obugs.net@gmail.com


core.repositoryformatversion=0


core.filemode=true


core.bare=false


core.logallrefupdates=true


 


其实这些配置是存放在个人主目录下的 .gitconfig 文件中的


 


$ cat ~/.gitconfig


[user]


name = GIT Admin


email = obugs.net@gmail.com


 


3、建立工程


本地存储的任何一个目录都可以建立GIT工程,如果已有工程位于 /home/obugs/projects/orangebugs 目录,就可以把这目录定义为GIT工程


$ cd /home/obugs/projects/orangebugs


$ git init


Initialized empty Git repository in /home/obugs/projects/orangebugs/.git/


 


这样就建立了一个名为 .git 的文件夹,这就是GIT用来存储信息和跟踪改动的文件夹。


  www.2cto.com  


$ ls -altr .git


total 40


drwxrwxr-x 4 git git 4096 Aug 13 22:39 refs


drwxrwxr-x 4 git git 4096 Aug 13 22:39 objects


drwxrwxr-x 2 git git 4096 Aug 13 22:39 info


drwxrwxr-x 2 git git 4096 Aug 13 22:39 hooks


-rw-rw-r -- 1 git git 23 Aug 13 22:39 HEAD


-rw-rw-r -- 1 git git 73 Aug 13 22:39 description


-rw-rw-r -- 1 git git 92 Aug 13 22:39 config


drwxrwxr-x 2 git git 4096 Aug 13 22:39 branches


drwxrwxr-x 36 git git 4096 Aug 13 22:39 ..


drwxrwxr-x 7 git git 4096 Aug 13 22:39 .


 


4、向工程添加和提交文件


这些动作和CVS、SVN等操作类似


 


$ git add *.java *.c


$ git commit -m ‘Initial upload of the project’


create mode 100755 Orangebugs.java


create mode 100755 pwm/ui/DataManager.java


create mode 100755 pwm/ui/PasswordFrame.java


create mode 100755 pwm/tools/StrongEncryption.java


create mode 100755 pwm/tools/PasswordStrength.java


..


 


注意如果之前没有使用 git config 指定用户名和电子邮件地址,这里会报错


$ git commit -m ‘Initial upload of the project'


 


*** Please tell me who you are.


  www.2cto.com  


Run


 


git config  --global user.email “you@example.com”


git config  --global user.name “Your Name”


 


to set your account’s default identity.


Omit  --global to set the identity only in this repository.


 


fatal: empty ident not allowed


 


5、更改文件和提交改动


编辑文件、添加或者删除了一些字段


$ vi Orangebugs.java


 


查看和GIT仓库中的文件相比有了那些改动


 


$ git diff


diff  --git a/Orangebugs.java b/Orangebugs.java


index 6166ed1..fd82d32 100644


— a/Orangebugs.java


+++ b/Orangebugs.java


@@ -2,7 +2,7 @@


- public counter=10


+ public counter=55


 


如果要提交,需要先确保将文件添加到了临时区域(staging area)然后才能提交,提交时会自动打开​​系统​​的默认编辑器,用户添加一些注释后保存并退出编辑器的时候,这些注释就同时提交到仓库中去了


  www.2cto.com  


$ git add Orangebugs.java


$ git commit


[master 80f10a9] Added password strength meter functionality


1 files changed, 56 insertions(+), 7 deletions(-)


或者,简单一点的方法是使用 git commit -a 把上面两个命令合二为一。


6、查看状态和查看注释


如果本地的文件和远端GIT仓库上的文件相比没有任何改动,则


 


$ git status


# On branch master


nothing to commit (working directory clean)


 


如果本地做了改动但是没有提交,则


 


$ git status


# On branch master


# Changes not staged for commit:


# (use “git add …” to update what will be committed)


# (use “git checkout — …” to discard changes in working directory)


#


# modified: Orangebugs.java


#


no changes added to commit (use "git add" and/or "git commit -a")


 


另外,可以用下面的命令查看文件历史和以往的注释


 


$ git log Orangebugs.java


commit c919ced7f42f4bc06d563c1a1eaa107f2b2420d5


Author: GIT Admin  www.2cto.com  


Date: Sat Aug 13 22:54:57 2011 -0700


 


Added password strength meter functionality


 


commit c141b7bdbff429de35e36bafb2e43edc655e9957


Author: GIT Admin


Date: Sat Aug 13 20:08:02 2011 -0700


 


Initial upload of the project


 



6、各种问题

(1)出现’gitosis-admin’ does not appear to be a git repository,短路径无效时替换为全路径

在服务器上使用短路径会取现下面这个问题,原因是没有找到对应匹配的密钥所致,如果正确使用了ssh密钥则不会出现这个问题,这里就不去折腾了




1


2


3


4


5




​root@stu-system:/home/git/repositories# git clone git@127.0.0.1:gitosis-admin.git​


​Cloning into gitosis-admin...​


​git@127.0.0.1's password:​


​fatal: 'gitosis-admin' does not appear to be a git repository​


​fatal: The remote end hung up unexpectedly​



使用以下命令解决,只不过每次push和pull的时候都需要输入一遍git用户的密码,略为繁琐




1




​git clone git@127.0.0.1:/home/git/repositories/gitosis-admin.git​



(2)出现Unable to create temporary file: Permission denied

在Windows上使用TortoiseGit执行Push时出现以下错误




01


02


03


04


05


06


07


08


09


10




​git.exe push --force --progress  "origin" master:master​


 


​Counting objects: 189, done.​


​Compressing objects: 100% (187/187)​


​Writing objects:   7% (14/189)​


​fatal: Unable to create temporary file: Permission denied​


​fatal: sha1 file '<stdout>' write error: Invalid argument​


​error: failed to push some refs to 'git@10.73.4.46:channelv.git'​


 


​git did not exit cleanly (exit code 1)​



原来是服务器上是用root账户建立的库目录,导致git账户无权写入,方法就是修改文件夹的所属用户和所属用户组




1


2




​root@stu-system:/home/git/repositories# chown -R git *​


​root@stu-system:/home/git/repositories# chgrp -R git *​



(3)出现failed to push some refs to ‘git@10.73.4.46:channelv.git’

在Windows上使用TortoiseGit执行Push时出现以下错误




01


02


03


04


05


06


07


08


09


10


11


12




​git.exe push --progress  "origin" master:master​


 


​Counting objects: 189, done.​


​Compressing objects: 100% (158/158)​


​Writing objects: 100% (189/189), 1016.00 KiB | 997 KiB/s​


​Writing objects: 100% (189/189), 1.12 MiB | 997 KiB/s, done.​


​remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.​


​To git@10.73.4.46:channelv.git​


​! [remote rejected] master -> master (branch is currently checked out)​


​error: failed to push some refs to 'git@10.73.4.46:channelv.git'​


 


​git did not exit cleanly (exit code 1)​



在服务器对应的库目录下执行以下命令增加配置即可


1




​git config --bool core.bare true​





学习时的痛苦是暂时的 未学到的痛苦是终生的