当前位置 : 首页 » 文章分类 :  开发  »  Eclipse-EGit插件使用

Eclipse-EGit插件使用

[TOC]


Eclipse中安装EGit插件

EGit是Eclipse中的一个Git版本控制插件,和SVN插件Subclipse一样,也是Eclipse Team组件的一个实现,安装后会出现在Team选项中。
官网是 http://www.eclipse.org/egit/
Eclipse Juno(3.8及4.2)及以上版本中已自带EGit插件,无需手动安装。
若Eclipse中没有此插件,手动安装方法如下:
Help -> Install new software -> Add… ->填入地址
http://download.eclipse.org/egit/updates
出现EGit相关插件,勾选,安装。
或者直接在Eclipse Marketplace中搜索EGit安装。


配置Git用户信息

Git用户信息配置包括用户名和邮箱,主要用来标识是谁提交了代码,在开始使用Git之前一定要配置。
Eclipse中,Window -> Preferences -> Team -> Git -> Configuration -> User Settings标签页
用户名配置:点击Add Entry,Key输入user.name,Value输入用于标识自己git提交的名字
邮箱配置:点击Add Entry,Key输入user.email,Value输入用于标识自己git提交的邮箱
此步骤相当于在Git命令行中执行:

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

之后提交代码时候,会自动提取这些信息,并且它会和代码一起写入到你的每一次提交中。

不管是在Git命令行中使用git config --global命令配置,还是在Eclipse插件EGit的GUI界面中配置,这些配置信息默认都是存储在Git的~/.gitconfig配置文件中(Windows上一般是C:\Users\$User\.gitconfig,所以如果在EGit配置之前就已经用命令行配置过,EGit会自动从默认的C:\Users\$User\.gitconfig 文件中读取这些配置。

例如,我在使用Eclipse的EGit之前,系统中已安装了msysgit,一直在用Git Bash命令行使用Git,主要用来部署GitHub Pages博客,所以当我打开Git -> Configuration配置界面时,自动就读取了我的配置,如下图:

打开我的C:\Users\MaSi\.gitconfig 配置文件,内容如下:

[filter "lfs"]
    smudge = git-lfs smudge %f
    required = true
    clean = git-lfs clean %f
[user]
    name = masikkk
    email = masi.1989@163.com
[http]
    proxy = http://172.17.18.80:8080

与Eclipse界面中是一样的。配了http.proxy是因为公司访问外网要配代理,那个filter配置不知道是怎么加进来的,不是我手动配的,不管他。
同理,之后在命令行中更新git配置后,EGit中也会同步修改,因为都是同一个配置文件。


创建本地Git仓库

在已有项目上创建本地Git仓库

在已有项目(以我本地的jms-test maven项目为例)上点右键 -> Team -> Share Project… -> 选择Git ->弹出Git仓库配置界面如下:

已自动勾选项目jms-test,点击”Create…”按钮,在弹出的对话框中选择一个存放Git项目的文件夹(我这里选的是D:\git\eclipse-Java),点Finish完成。项目jms-test会被从原来的Eclipse工作空间剪切到git目录,这时打开eclipse-java文件夹,会看到有一份jms-java项目的源码,同时原来项目所在的Eclipse工作空间中就找不到此项目了。注意此时jms-test项目的文件还没有被Git跟踪。

此步骤执行了什么操作呢?
要分两种情况说,以我选择的D:\git\eclipse-Java文件夹为例:

  • 1、如果eclipse-Java是新建的空文件夹
    点击完成后会将选择的eclipse-java文件夹初始化为git文件夹,相当于命令行中在eclipse-java目录下执行git init命令,然后会将jms-test项目从原文件目录剪切到此文件夹中,此后jms-test项目成为eclipse-java仓库中的一个子文件夹。
  • 2、如果eclipse-Java是已经是初始化过的git文件夹
    也就是说eclipse-Java已经是一个本地git仓库的话,系统不会再次初始化此文件夹,只是将jms-test项目剪切到此文件夹中,同样,此后jms-test项目成为eclipse-java仓库中的一个子文件夹。

所以,如果将多个项目Share Project到同一个git文件夹中,这些项目会成为此git仓库的子目录,他们属于同一个本地git仓库。如果想每个项目有一个单独的git仓库,需要Share Project到不同的git文件夹中。


Maven多模块项目上创建本地仓库

Maven多模块项目Share Project到git仓库时会遇到问题,不过是可以解决的。
我们首先创建一个Maven Project作为父项目,Artifact Id为demo-parent,Packaging打包类型为pom;然后在demo-parent中创建一个Maven Module子模块,Module Name为demo-jms。创建完成后,虽然Eclipse中将这两个项目列为并列的Project,但在文件系统上,demo-jms是demo-parent中的一个子文件夹,Share到Git仓库出问题的原因就在这里。

这时,如果我们将父项目demo-parent Share Project到git仓库,会发现子项目demo-jms中的资源都找不到了,如图:

再刷新一下项目,会看到只剩下.project文件了。

为什么呢?因为demo-jms是demo-parent中的一个子文件夹,Share父项目时将项目中所有资源都从原目录剪切到git目录了,所以子项目demo-jms会找不到资源。

不要着急,解决方法分两个步骤:

  • 1、先在Eclipse中删除子项目demo-jms,Delete项目时,无论是否勾选”Delete project contents on disk (cannot be undone)”都可以,因为反正此时原项目所在的文件系统目录上已经没有此项目的所有资源文件了。
  • 2、File > Import… > Maven > Existing Maven Projects,选择git仓库中的子项目demo-jms,重新将其导入为maven项目。

导入完成后看到这两个项目还未被Git跟踪,之后可以继续git提交等操作,提交时,只需要在父项目上Commit,子项目会自动一起提交,因为子项目只是父项目的一个子文件夹。

注意:对于多模块Maven项目,在Eclipse中Share Project到Git仓库时,要么只Share父项目,要么父项目和子项目同时选中一起Share,不能先Share子项目后Share父项目。
我们可以试一试先Share子项目会怎么样?
我们先将子项目demo-jms Share Project到git仓库,完成后Eclipse中子项目是完好的,只是project所在文件系统目录改变了,父项目demo-parent中的文件夹demo-jms消失。然后再将父项目demo-parent Share Project到git仓库,然后去git仓库目录看下,发现demo-jms和demo-parent成了git仓库中的两个并列文件夹,破坏了父子项目间的目录层级关系。解决方法是将git仓库中的demo-jms文件夹剪切到demo-parent中,然后Eclipse中删除demo-jms项目后再重新导入Existing Maven Projects。

还有个比较好的方法是,创建完父项目后先将其Share Project到git仓库,然后再在其中创建Maven Module子模块,就不用删除后再导入了。

这个问题网上也不少人遇到,见下面两个StackOverflow问题,其中的回答解释的非常详细:


EGit状态图标

Share Project完成后,在Eclipse中项目状态如下:

文件或文件夹上的问号?表示“新添加的未跟踪文件”,即还没执行git add
文件夹前面的>符号表示修改后未提交,即修改后未执行git commit
可在Window -> Preferences -> Team -> Git -> Label Decorations中看到所有图标示例,详细介绍见 https://wiki.eclipse.org/EGit/User_Guide#Icon_Decorations


git目录的选择建议

git目录即.git隐藏文件夹所在的目录,选择时注意:

  • 1、不要在Eclipse工作目录(workspace)中建立git目录
    因为Eclipse工作目录在编译、构建时会经常变动,git如果一直监视此目录,在扫描和计算变换时会有性能问题。
  • 2、不要使project根目录成为git目录
    因为project根目录中有Eclipse的.project配置文件,这样仓库中再建其他project就会出问题。

Considerations for Git Repositories to be used in Eclipse
https://wiki.eclipse.org/EGit/User_Guide#Considerations_for_Git_Repositories_to_be_used_in_Eclipse


断开项目git连接

在项目上点右键 -> Team -> Disconnect 即可在Eclipse中断开项目的Git连接,但只是在Eclipse中不关联git了,在Git Bash中操作的话还是会看到此项目是继续被Git跟踪的。


提交项目到本地仓库

现在jms-test项目已Share Project到本地git仓库,但只是将工程文件拷贝到git目录中,这些文件还没有被跟踪,即还没执行git add

首次提交项目到本地仓库

There are no stages files错误

在jms-test项目上点右键 -> Team -> Commit… -> 默认会打开Git Staging视图,直接点Commit的话会弹出错误提示”There are no stages files”,如下图:

为什么呢?
因为这些文件还没有被添加到暂存区(staging area),或者说还没被git跟踪,或者说还处于untracked状态,或者说还没被执行git add命令
这里得明白git提交的工作流程,如下图:

git add 命令将内容从工作目录添加到暂存区(或称为索引(index)区),以备下次提交。 当执行git commit命令时,默认情况下它只会检查暂存区域,我们还没有将项目添加到暂存区,所以提交时提示”There are no stages files”。
解决方法:
在Unstaged Changes列出的文件上点右键,选择”Add to Index”即可将项目添加到暂存区,然后Commit就没错了。


将提交视图切换为Commit Dialog对话框

装上EGit插件后,第一次提交时默认打开Git Staging视图,其实Git Staging视图不是提交时常用的视图,我们大多数情况下更习惯于使用Commit Dialog,即提交对话框,做如下配置修改:
Window -> Preferences -> Team -> Git -> Committing,去掉”Use Staging View to commit instead of Commit Dialog”选项前的勾,以后Commit时就会使用提交对话框了。


首次提交项目到本地仓库

再次在jms-test项目上点右键 -> Team -> Commit… ->弹出提交对话框,如下:

可以看到,列出的文件上都有问号,说明都处于未被跟踪状态,直接全部勾选后点提交,系统会同时帮我们执行git addgit commit,不需要分开操作。
当然,如果想分开操作也是可以的,先在jms-test项目上点右键 -> Team ->选择”Add to Index”即跟踪项目中的所有文件,相当于命令行中在jms-test文件夹中执行git add .操作。然后再右键 -> Team ->Commit…,弹出提交对话框,可以看到所有文件上没有问号了,说明都已被跟踪,输入提交信息Commit Message后点提交,相当于命令行中执行git commit -m "提交信息"


修改项目后提交到本地仓库

已被git跟踪的项目,修改或新增文件后的提交过程与首次提交类似,直接项目上点右键 -> Team -> Commit… ->弹出提交对话框,提交对话框中,已被跟踪的文件默认已勾选,新增的未被跟踪的文件默认不勾选,勾选想提交的文件后Commit即可。

注意:如果多个项目在同一个本地git仓库中,其他项目有修改但本项目没有修改,在本项目上Team->Commit时也会显示其他项目中改动后未提交的文件,不要惊讶,这是合理且正确的,因为Eclipse中的不同项目只是同一个git仓库的不同子文件夹,就和命令行操作git一样,我们在子目录中执行git status命令时看到的也是整个git仓库中的所有改动文件的状态。


.gitignore忽略配置

jms-test项目上创建git仓库后,默认生成的.gitignore文件内容为/target/,即忽略target文件夹,提交后发现.settings文件夹和.project文件也被纳入版本控制了,这两个本地工程配置我们不需要提交的git,可以配置.gitignore文件忽略这两个文件。
有两种方法:

  • 1、直接修改.gitignore文件,将要忽略的文件写入其中
  • 2、在要忽略的文件或文件夹上点右键->Team->Ignore,然后会发现.gitignore文件内容变了,忽略的文件被写入.gitignore文件

所以不管直接修改.gitignore还是在界面上操作,最终都是对.gitignore文件的配置

之后再提交一次,发现.settings和.project还在版本控制中,为什么?
因为配置.gitignore文件只是让git忽略其中文件的变动,提交时不去检查这些文件。但我这里的问题是.settings和.project在第一次提交时已经被纳入版本控制了,已经存在于本地git仓库中,即便忽略他们的变更,也改变不了他们已经在git仓库的事实。
所以怎么办呢?分两种情况说明:

  • 1、首次git提交前就配置好.gitignore文件,这样就不会检查被忽略文件的修改状态,也不会被提交到git仓库
  • 2、如果需要忽略的文件已经提交到git仓库了,需要将其从git仓库中删除(使此文件不再受git版本控制),但本地要保留(因为我们项目中要用),需要在命令行中使用git rm --cached命令,下节介绍。当然之后也要将其写入.gitignore文件,避免再次被提交到git仓库。

Eclipse中不显示.gitignore文件

Eclipse中默认会隐藏.开头的配置文件,显示方法是点包管理器右边的下三角,选择Filters…,在Java Element Filters对话框去掉.* resources前面的勾即可显示.开头的文件,勾选后会隐藏.开头的文件。


删除git仓库中文件但本地保留

对于eclipse的maven项目,.classpath.project.settings/target/ 等文件和目录如果被提交到git仓库,并不方便其他项目成员使用,而且因为本地的环境变化,还会频繁要求提交这些文件的修改,所以这些文件不建议纳入git版本控制,通常.gitignore文件配置如下:

/target/
/.settings/
/.project
/.classpath

不过如果这些文件之前已经提交过,即已经被纳入git版本控制中,配置.gitignore也并不会将其从git版本控制中移除,这时需要在命令行中使用git rm --cached命令。Eclipse中EGit图形界面上没找到怎么操作。

我们想把文件从Git仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让Git继续跟踪。当你忘记添加.gitignore文件,不小心把一个很大的日志文件或一堆.a这样的编译生成文件添加到暂存区时,这一做法尤其有用。为达到这一目的,需要使用git rm命令的--cached选项。
打开Git Bash命令行,执行如下命令将这些文件从git仓库删除:

git rm -r --cached .settings/  
git rm --cached .classpath
git rm --cached .project
git commit -m "remote .settings .classpath from git"

类似rm命令,删除文件夹时要带-r选项,最后别忘了还要git commit提交才能生效。
然后看到Eclipse中这几个文件的图标发生变化,标识已纳入版本控制的圆柱形图标没了:

这时如果文件图标变为问号?是怎么回事呢?
这种情况发生在.gitignore文件中没有配置忽略此文件,虽然已不在git版本控制中,但git还视图跟踪它,就会显示问号,这时将此文件写入.gitignore,或在文件上点右键->Team->Ignore,使git忽略这些文件,就会去掉问号图标。


参考


push代码到远程仓库

在GitHub上创建一个项目,例如名为gittest-amq

使用https协议push到远程仓库

本地commit后在jms-test项目上点右键 -> Team -> Remote -> Push…,弹出push到远程仓库对话框
URI中填入GitHub项目https地址:https://github.com/masikkk/gittest-amq.git
然后自动会提取Host,Repository path和Protocol,Authentication中填入自己GitHub用户名和密码,如下图:

点击下一步,弹出分支选择界面,Source ref选择想要被push的本地git仓库分支(我这里只有一个master分支),Destination ref选择想要push到的远程git仓库的分支(我这里同样只有一个master分支),然后点击Add Spec,会添加一条push指定,如下图:

或者直接点击”Add all branches spec”,如果只有一个本地分支和一个远程分支,就自动对应上了。
然后点击Finish就会push到远程仓库,push的内容是从上一次push之后的所有本地commit,结束后弹出push结果提示框,如下图:


使用ssh协议连接Git远程仓库

ssh密钥配置

生成ssh keys

在Eclipse中,Window -> Preferences -> General -> Network Connections -> SSH2
在General页,确认SSH2 home位置,即ssh配置所在目录,用于存储ssh密钥文件,默认即可,一般为C:\Users\$User\.ssh

如果还没有ssh keys密钥文件,切换到Key Management页生成。选择点击Generate DSA key或Generate RSA key按钮(相当于ssh-keygen命令的-t参数),生成DSA或RSA算法的密钥。生成密钥后,填写Comment简要注释(相当于ssh-keygen命令的-C参数),填写Passphrase(可选填项,相当于password,用于加密保护私钥,填写后每次上传服务器,将要求提供此密码验证私钥的使用权)(相当于ssh-keygen命令的-P参数),点击Save Private Key,打开文件保存对话框,将密钥保存到文件。

之后切换到General页,会发现自动将刚保存的私钥文件添加到Private keys中了。

将公钥添加到GitHub

登陆github页面,点击右上角的 Account Settings -> SSH Public keys -> add another public keys
打开刚才生成的公钥文件id_rsa.pub,复制其内容粘贴到GitHub页面的文本框中。

测试连接是否成功

Git Bash中执行 ssh -T git@github.com
返回:

$ ssh -T git@github.com
Hi masikkk! You've successfully authenticated, but GitHub does not provide shell access.

说明连接成功。

说明一下我的情况,在使用Eclipse中的EGit之前就已经在使用Git Bash,也配置过ssh连接GitHub远程仓库,所以这一步我完全没有在Eclipse中操作,直接默认就读取了密钥文件。


使用ssh协议push到远程仓库

本地commit后在jms-test项目上点右键 -> Team -> Remote -> Push…,弹出push到远程仓库对话框
URI中填入GitHub项目ssh地址:git@github.com:masikkk/gittest-amq.git
然后自动会提取Host,Repository path,Protocol不用选,User就是默认的git,如下图:

直接点Next,弹出分支选择界面,到此步就和使用https协议push到远程仓库一样了,不多说。push完同样会弹出结果提示:


导入Git项目到Eclipse(针对maven项目)

针对maven项目来说,导入远程Git项目到Eclipse中有3种方法:

  • 1、在Eclipse中clone git仓库到本地,然后导入项目到Eclipse
  • 2、在Eclipse外部clone git仓库到本地,然后在Eclipse中选择从本地文件系统上的git仓库导入项目
  • 3、在Eclipse外部clone git仓库到本地,然后在Eclipse中选择导入已存在的maven项目,会自动关联git

Eclipse中,File > Import… > Git > Projects from Git > Next > 出现2个选项:

  • Existing local repository,用于从本地文件系统上的git仓库导入项目,比如之前已clone到本地的一个git仓库但还没导入Eclipse
  • Clone URI,用于从远程git仓库导入项目

从远程Git仓库clone并导入项目

在Eclipse中clone远程git仓库到本地

Eclipse中,File > Import… > Git > Projects from Git > Next > Clone URI > Next
弹出从Git导入项目对话框,此界面也可以从Git Repository视图中打开,点击”Clone a Git Repository and add the clone to this view”,如下图:

首先是远程Git仓库配置界面,URI填入远程仓库地址,比如导入我之前上传到GitHub的一个Git测试仓库eclipse-gittest的ssh地址:git@github.com:masikkk/eclipse-gittest.git ,里面包含两个maven项目gittest和gittest2
填入URI后其他都不用动,如图:

直接点Next,系统会联网从GitHub读取项目信息,读取成功后来到分支选择界面,如下图:

我这个项目只有一个master分支,选中后点Next,来到本地git仓库目录配置界面:

  • Directory:选择本地git仓库位置,如果目录不存在会新建
  • Initial branch:选择创建并切换到(check out)哪个本地分支
  • Remote name:配置远程分支的简写名称,默认为origin

点击Next,开始从远程仓库clone项目到本地,clone完成后本地目录上已经有此远程仓库的内容了,如下:

MaSi@MaSi-Dell MINGW64 /d/git/eclipse-gittest (master)
$ cd /d/git/eclipse-gittest/

MaSi@MaSi-Dell MINGW64 /d/git/eclipse-gittest (master)
$ ls
gittest/  gittest2/

MaSi@MaSi-Dell MINGW64 /d/git/eclipse-gittest (master)
$ git remote -v
origin  git@github.com:masikkk/eclipse-gittest.git (fetch)
origin  git@github.com:masikkk/eclipse-gittest.git (push)

导入项目到Eclipse

clone完成后继续点Next的话会弹出导入project界面:

从这里开始就相当于从本地git仓库导入项目到Eclipse了,当然也可以直接选择“Cancel”,以后有空的时候再导入。
我们这里直接开始导入,由于我这个git仓库中有两个java maven项目,选择其中的gittest项目,导入向导选择Import existing Eclipse projects会出错,提示No projects found,因为我们没有上传.project文件到git仓库,所以Eclipse无法将其识别为Eclipse project。
选择Import as general project,将项目导入为普通项目,完成。


转换为maven项目

通过Import as general project方式导入后的项目是普通项目,将其转换为maven项目:
在项目上点右键 -> Configure -> Convert to Maven Project,由于我们项目中已经有maven的pom.xml配置,所以不需要任何其他操作就能直接转换为maven项目。


clone到本地后从本地Git仓库导入

先在Eclipse外部把项目clone到本地文件系统上,用Git Bash或GitHub桌面版都行,然后在Eclipse中导入。
Eclipse中,File > Import… > Git > Projects from Git > Next > Existing local repository > Next
弹出本地git仓库选择界面,如下图:

Eclipse会自动列出已经识别的本地git仓库,如果这里没有可以点”Add…”添加新的本地git仓库位置,选择从GitHub上clone到本地的git仓库eclipse-gittest,点击Next,来到导入project界面,如下图:

到此步就和上一节clone完后的导入过程一样了,也是先导入为普通项目,再转换为Maven项目。


clone到本地后导入已存在的maven项目

先在Eclipse外部把项目clone到本地文件系统上,用Git Bash或GitHub桌面版都行,然后在Eclipse中导入。
以导入gittest2项目为例,Eclipse中,File > Import… > Maven > Existing Maven Projects > Next > 点击Browse…选择项目所在目录,如下:

自动识别项目中的pom.xml配置文件,点击Finish完成,即成为一个Maven项目,而且还自动关联了Git版本控制。


从远程Git仓库pull拉取更新

假如本地项目已关联Git,也向远程仓库push过代码,后来代码被其他人修改并push到了远程仓库,那么之后本地写代码前需要先从远程仓库把最新版代码pull下来,在最新版代码上再做修改。
在项目上点右键 -> Team -> Pull…
来到了添加远程仓库界面:

  • Remote name:远程仓库名称(shortname),默认已填入origin,一般只有一个远程仓库的话我们都以origin命名,也即我们git clone时自动添加的远程仓库名。
  • URI:远程仓库地址,可以使用https协议地址或ssh协议地址。填入地址后其他的Host, Repository path, Protocol, User都会自动填入,不需要做任何修改。

使用ssh协议pull更新

如果使用ssh协议,如下图,填入地址后直接下一步即可,身份验证用上面配置的密钥

使用https协议pull更新

如果使用https协议,如下图,可以在此处填入GitHub账号密码并保存,当然也可以以后填,然后点下一步。
外话一句,最近公司内使用ssh协议连不上GitHub,push和pull都不行,但切换为https协议就可以。

pull操作配置界面

点下一步后来到配置pull操作界面:

  • Remote:这里比较疑惑,没有直接读出刚配置的Remote,还需要点“New Remote”,在弹出的Add Remote界面重新输入一遍刚才的远程仓库配置才行。
  • Reference:远程仓库的分支,在输入框内按空格会联网去读取刚配的Remote仓库有哪些分支并列出来供选择。
  • When pulling:pull之后的合并操作,有rebase和merge,一般无脑选merge,即git pull等同于先做git fetch,再做git merge
  • Configure upstream for push and pull:是否在本地分支与此远程仓库分支之间创建追踪关系(tracking)

点Finish后会从远程分支拉取最新代码与本地分支合并。

每个Git仓库的配置

之后在Eclipse中,打开Window -> Preferences -> Team -> Git -> Configuration -> Repository Settings标签页
Repository选择刚才的java-jmx,可以看到新增了一个remote配置项,如下图:

所以其实刚才我们的配置是执行了git remote add命令,新增了一个远程仓库配置。如果之前Push时配置了远程仓库,pull时会跳过远程仓库配置界面,直接来到配置pull操作界面,我这里为了说明先在配置文件中将remote配置删除了。

在Location中可以看到这些配置实际上是存储在每个git仓库目录下的.git隐藏文件夹中的,可以将对应的配置文件打开看看。
打开我的D:\git\java-jmx.git\config,内容如下:

[core]
    repositoryformatversion = 0
    filemode = false
    logallrefupdates = true
[remote "origin"]
    url = https://github.com/masikkk/java-jmx.git
    fetch = +refs/heads/*:refs/remotes/origin/*

所以,直接修改此配置文件、在Eclipse外使用Git Bash命令行配置、在Eclipse EGit界面中配置,结果都是一样的。


参考


上一篇 Hexo博客(15)部署与备份总结

下一篇 Eclipse-Eclipse中创建Maven项目

阅读
6,934
阅读预计27分钟
创建日期 2017-08-18
修改日期 2017-10-25
类别
百度推荐