【问题标题】:How to deal with forked gems and bundle如何处理分叉的宝石和捆绑
【发布时间】:2015-09-02 21:56:29
【问题描述】:

我已经分叉了一个 gem,它托管在 Github 上。

然后,在 Gemfile 中,这就是我所拥有的:

gem 'mongoid-scroll', git: 'https://github.com/bgvo/mongoid-scroll.git'

每当我使用 Pry gem-opem 命令对 gem 进行更改时,更改都会保存在以下目录下:

/Users/borjagvo/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/bundler/ruby/2.1.0/bundler/gems/

有些事情让我很困惑:

1) 在这个目录中有两个mongoid-scroll gems(mongoid-scroll-7e23e72653c6mongoid-scroll-23bc60ce76bd)而不是只有一个。我认为这个目录中的 gem 是运行 bundler 时使用的 gem。 bundler 如何确定这是使用的一个而不是另一个?

2) 如果我尝试将更改推送到 Github 存储库:

Borjas-MacBook-Pro:mongoid-scroll-7e23e72653c6 borjagvo$ git push
Counting objects: 10, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (10/10), 1.00 KiB | 0 bytes/s, done.
Total 10 (delta 6), reused 0 (delta 0)
To /Users/borjagvo/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/bundler/ruby/2.1.0/cache/bundler/git/mongoid-scroll-f814a84d6332ef5d28cf5db04da93b434e01f07b
   d8f9f91..696bdce  master -> master

我发现 Github 存储库不是上传更改的地方。 执行git config --get remote.origin.url查看来源:

Borjas-MacBook-Pro:mongoid-scroll-7e23e72653c6 borjagvo$ git remote show origin
* remote origin
  Fetch URL: /Users/borjagvo/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/bundler/ruby/2.1.0/cache/bundler/git/mongoid-scroll-    f814a84d6332ef5d28cf5db04da93b434e01f07b
  Push  URL: /Users/borjagvo/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/bundler/ruby/2.1.0/cache/bundler/git/mongoid-scroll-    f814a84d6332ef5d28cf5db04da93b434e01f07b
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

什么是从捆绑器使用的 gem 将更改上传到 Github 中的分叉存储库的好方法(请记住,我使用的是 Pry 命令gem-open)。

谢谢。

【问题讨论】:

    标签: ruby-on-rails git github gem bundler


    【解决方案1】:

    Gemfile.lock 应该知道要加载什么 gem,当您进行捆绑更新或安装新 gem 时,Gemfile.lock 也将使用新的 gem、路径等进行更新。以及修订哈希。

    运行git remote show origin 时看到的Fetch/Push URL 末尾的哈希必须与Gemfile.lock 中的revision 相同。

    例如,在 Gemfile.lock 中使用 active-admin gem 时,我有:

    GIT
      remote: git://github.com/gregbell/active_admin.git
      revision: b7e8c7dde2c26a47e5db0dd1efc163405afadd9d
      specs:
        activeadmin (1.0.0.pre)
        ...
    

    即使我有 2 个 active-admin gem,也只有一个有修订版:b7e8c7dde2c26a47e5db0dd1efc163405afadd9d

    但是,使用分叉,这是我所做的:

    我通常fork它,pull我电脑上的gem,更新我的应用程序的Gemfile以使用带有path参数的本地存储中的gem,我可以更新gem每次我为了测试它而做一些小改动时,都不会将它推送到 github。

    当我让它按照我的需要工作时,我将它推送到 github 并更改我的应用程序的 Gemfile 中的路径,再次运行 bundle 以更新路径 Gemfile.lock,我一切就绪。至少在这里你不会混淆应用正在加载什么 gem。

    【讨论】:

    • 谢谢!所以我应该假设你可以指定捆绑一个 git repo 来下载 gem。但是,一旦它在本地存储上,您就无法对其进行更改并直接推送到从中下载它的存储库。对吗?
    • 如果您在本地存储上克隆 gem,默认情况下您将设置 git,因此您可以直接推送到它被克隆的存储库。例如,您将克隆您的分叉存储库你只能推送到你的仓库。
    • 但是,我不确定我是否正确理解了你的问题
    • 明白。我的问题是关于 bundle 是否自动完成了您描述的过程(现在我知道它没有)。但这可能是有道理的。
    猜你喜欢
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多