Gemfile.lock总是有未提交的更改

14

我在一个正在开发的Rails应用程序中遇到了这个问题。 我正在一个功能分支上工作,并希望从最新的主分支上变基。 我运行了以下命令:

$ git checkout master
$ git pull --rebase

如果我尝试回到我的功能分支进行结账,我会收到以下错误:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

  modified:   Gemfile.lock
我已尝试以下命令将Gemfile.lock文件还原为aster,但均未成功:

我已尝试以下命令将Gemfile.lock文件还原为aster,但均未成功:

$ git checkout -- Gemfile.lock
$ git stash
$ git reset HEAD --hard

每次我运行一个新的git命令,我都会回到Gemfile.lock文件,其中有未提交的更改。

以下是我正在使用的库的版本:

$ git --version => 2.3.3
$ bundler --version => 1.7.9

有什么变化吗?有什么重大的变化吗? - D-side
请再次运行gem install bundler以升级Bundler。Bundler 1.7.9存在一些错误,可能会在某些情况下导致Gemfile.lock出现意外变化。这些错误已在更高版本中得到修复。至于仅运行git命令时出现的原因,我认为Matt Brictson的答案是最好的。 - Tim Moore
2个回答

34

可能有一些在后台运行的进程或执行git命令时的某些副作用正在修改Gemfile.lock文件。

我不熟悉rvm的魔法(虽然听起来很有道理);以下是一些其他需要检查的事项:

  • 在最近版本的Rails中,有一个名为"spring"的后台进程在运行。尝试运行spring stop(或 bin/spring stop bundle exec spring stop )优雅地终止该进程。
  • 同样,如果您有任何其他与Rails相关的进程,例如rails server、guard、zeus、sidekiq等正在运行,请尝试关闭它们。
  • 您可能正在运行一个git pre-commit hook。请检查.git/hooks目录。
  • git可能是您的shell中另一个命令的别名。运行alias以查看shell别名列表。
  • 您的shell提示符可能会执行代码以执行诸如在提示符中显示当前git状态和分支名称之类的操作。此代码将在每个shell命令之后执行以重新绘制提示符,并可能具有副作用。检查您的.bashrc.bash_profile

15
谢谢,我的问题出在Spring上。执行 spring stop 后,我成功地执行了 git checkout -- Gemfile.lock - Brian
3
好的,我们在一个新的Rails 4.2项目中也遇到了同样的问题,原因是Spring。非常有帮助! - jwadsack
1
运行 spring stop 后,我需要随后运行 spring start 吗? - Bruno Peres
2
@BrunoPeres 不会,Spring 会在下一次运行 Spring 启用的命令(如 railsrake)时自动重新启动。 - Matt Brictson

0

有时候运行rails命令或其他bundle exec命令会在不知不觉中更新您的Gemfile.lock。我猜想您是在git命令之间的某个时候这样做的。或者您安装了一些奇怪的东西,它会在不可见的情况下执行此操作。

(rvm能够在不可见的情况下执行此操作吗?我不知道。我认为rvm会执行各种奇怪的操作,所以不使用它。)

无论如何,发生这种情况可能表明其他事情正在发生,而这并不是您想要的--您确定您要提交的Gemfile和Gemfile.lock实际上是兼容的吗?通常情况下,只要Gemfile发生任何变化,最好运行bundle install以获取新的Gemfile.lock。如果您试图提交一个与Gemfile实际上不兼容的Gemfile.lock...我不确定为什么您要这样做,通常我希望在任何给定的提交中Gemfile和Gemfile.lock是兼容的。

要了解为什么某些(神秘的)东西可能会更改您的Gemfile.lock,请对Gemfile.lock进行git diff以查看其如何更改?


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