【问题标题】:EGit: Issuing a fast-forward pull ~ How to configure fetch for a remote repository in EGitEGit:发布快进拉取 ~ 如何在 EGit 中为远程存储库配置 fetch
【发布时间】:2016-03-30 13:59:48
【问题描述】:

所以让我设置我的场景。我在 Spring Tool Suite (Eclipse 4.5.1) 中使用 EGit 4.1.1。我和我精通技术的同事从远程 URL 克隆了同一个 git 存储库。我的精通技术的同事更喜欢命令行,他使用 VIM 进行文件修改,然后发出命令

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

现在更改位于远程存储库中。现在,我不太喜欢 CLI,更喜欢 GUI,我在 Eclipse 中使用 EGit。要接收更改,我右键单击项目(我最初使用 EGit 克隆的项目),转到 Team -> Pull,然后我被告知有“Nothing to fetch”。出于理智的目的,我打开了“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 并查看 fetch 配置时,它是空白的。

【问题讨论】:

    标签: eclipse git egit git-pull


    【解决方案1】:

    为了补充 VonC 的答案,这意味着 我错过了一步,当我最初使用 EGit 配置 git 存储库时,我错过了一个步骤。因为我没有为 repo 配置 fetch,所以 Eclipse 给了我错误“Nothing to fetch”——也许它应该给我一个更有意义的错误,比如“Fetch not configured for this repository。要配置,你必须。 .." 也许我会在以后解决这个问题,因为 EGit 是开源的。

    要在 Eclipse (EGit) 中解决此问题,请执行以下操作:

    1. 确保 Git Repositories 视图已打开。
    2. 选择特定的 git repo,并展开它直到 remotes 中的特定远程被展开:
    3. 右击incoming源并选择Configure Fetch
    4. 在对话框中,如果您根本没有看到任何 fetch 配置,请选择 Ref Mappings 窗格旁边的 Add
    5. 在对话框中,对于 Source,键入 refs/heads/*(尽管出现“未在远程存储库中找到”消息。选择 Next
    6. 对于目的地,确保refs/remotes/origin/* 已填写(它可能会自动填充)。确保更新本地存储库,即使数据可能会丢失。点击完成
    7. 现在在 Configure Fetch 对话框中,您将看到新的 ref 映射:+refs/heads/*:refs/remotes/origin/*。这与 .gitconfig 文件中的内容相匹配。
    8. 现在,如果您打算稍后获取,请单击 保存,如果您想更新本地存储库,请单击 保存并获取

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

    【讨论】:

    • 很好的反馈,除了我的回答。 +1
    【解决方案2】:

    首先,reflog 不会在 获取(在命令行或 Eclipse 中)向您显示任何内容:它仅记录来自 本地 克隆的更改。

    其次,check your .gitconfig 看看远程源是如何配置的(还有seen here)。
    你需要有一行来获取:

    fetch = +refs/heads/*:refs/remotes/origin/*
    

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

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

    【讨论】:

    • @TimBiegeleisen 我怀疑 .gitconfig 没有完全配置,而命令行可能会将 fetch refspec 默认为refs/heads/&lt;head&gt;:refs/heads/&lt;branch&gt;,如git-scm.com/docs/git-fetch 中所述。我们需要先查看.gitconfig 以了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多