EGit:发出快进式拉取请求 ~ 如何在EGit中配置远程存储库的获取方式

4

让我来描述一下我的场景。我正在使用Spring Tool Suite(Eclipse 4.5.1)中的EGit 4.1.1。我和一个技术熟练的同事从远程URL克隆了同一个git仓库。我的技术熟练的同事喜欢使用命令行,在VIM中进行文件修改,然后发出命令。

git add .
git commit -m "Modified file"
git push

现在变更已经在远程仓库中了。作为一个不太擅长命令行的GUI用户,我正在使用Eclipse中的EGit。为了获取这个变更,我右键点击项目(最初是用EGit克隆的),选择Team-> Pull,结果告诉我“没有可获取的内容”。为了保证正常,我打开了“Git Reflog”视图,发现我的同事的变更未列出,于是我开始犯愁。
然后我去命令行输入命令“git pull”,哇!它拉取了我的同事的变更:
remote: Counting objects: 27, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 14 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (14/14), done.
From git://hostname.domain.com/git-repo
 * branch            master     -> FETCH_HEAD
Updating 123ae12..68cd2f0
Fast-forward

更好的是,我回到Eclipse,然后在“Git Reflog”视图中看到了变更列表,如下所示:
Commit   Commit Message     Date         Reflog Message
---------------------------------------------------------------
68cd2f0  Modified File      2015-12-23   pull: Fast-forward

因此,我觉得我被告知的内容让我相信有一个Git概念我不熟悉 - 我可能只是漏掉了什么。所以...

  • 我是否漏掉了任何关于git工作原理的明显东西?
  • 我假设快进意味着我只是在同一分支上向前移动我的HEAD
  • 我如何在Eclipse中通过命令行实现“git pull”?

编辑:为了回答VonC的答案,我添加了以下信息,既包含更多信息,也解决了这个问题。

从命令行运行(从存储库)cat ./.git/.gitconfig时,我得到以下输出:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
[remote "origin"]
        url = git://hostname.domain.com/git-repo.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

然而,当我进入Eclipse并查看获取配置时,它是空白的。

2个回答

9
补充VonC的答案,这意味着当我使用EGit进行配置时,我最初对git仓库的远程配置中错过了一步。由于我没有为该仓库配置fetch,Eclipse显示了错误“无内容可获取”,也许它应该给我一个更有意义的错误,如“未为此仓库配置fetch。要配置,请...”可能以后我会修复这个问题,因为EGit是开源的。
在Eclipse(EGit)中解决此问题,请执行以下操作:
  1. 确保打开了Git Repositories视图。
  2. 选择特定的git repo,并展开它,直到在remotes中展开了特定的远程: EGit Repository: Select Remote
  3. 右键单击incoming origin并选择Configure Fetch EGit Remote: Configure Fetch
  4. 在对话框中,如果您没有配置任何获取,请在Ref Mappings窗格旁边选择Add EGit Configure Fetch: Add Ref
  5. 在对话框中,对于Source,输入refs/heads/*(尽管会出现“Not found in remote repository”消息)。 选择NextEGit Add Ref: Select Source
  6. 对于Destination,确保填写了refs/remotes/origin/*(它可能会自动填充)。 确保选中了Update the local repository even if data could be lost。 点击FinishEGit Add Ref: Select Destination
  7. 现在在您的Configure Fetch对话框中,您将看到新的ref映射:+refs/heads/*:refs/remotes/origin/*。 这与.gitconfig文件中的内容匹配。 EGit Configure Fetch: Ref Added
  8. 如果您计划以后获取,请单击Save,或者如果您想要更新本地存储库,则单击Save and Fetch

我不太确定为什么EGit没有自动执行此操作,也许这是另一天的问题。


非常好的反馈,除了我的答案之外。+1 - undefined

3
首先,reflog不会显示任何关于fetch之前(在命令行或Eclipse中)的内容:它只记录本地克隆的更改。
其次,请检查您的.gitconfig以查看远程origin的配置情况(也可以在此处查看)。 您需要有一行来进行获取:
fetch = +refs/heads/*:refs/remotes/origin/*

默认情况下,命令行 git fetch 将使用当前分支:

refs/heads/<head>:refs/heads/<branch>

@TimBiegeleisen 我怀疑.gitconfig没有完全配置,而命令行可能会将fetch refspec默认为refs/heads/<head>:refs/heads/<branch>,正如http://git-scm.com/docs/git-fetch中所提到的。我们需要先看一下`.gitconfig`以了解更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接