Gemfile.lock始终具有未提交的更改

tom*_*opp 9 ruby git bundler gemfile.lock

我正在努力的rails应用程序上遇到这个问题.我正在开发一个功能分支,并希望从最新的主人那里重新定义.我运行了以下命令:

$ git checkout master
$ git pull --rebase
Run Code Online (Sandbox Code Playgroud)

如果我尝试检出我的功能分支,我会收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我尝试了以下命令将Gemfile.lock解析回aster,但没有一个成功:

$ git checkout -- Gemfile.lock
$ git stash
$ git reset HEAD --hard
Run Code Online (Sandbox Code Playgroud)

每次我运行一个新的git命令时,我都会回到Gemfile.lock,其中的更改没有为commit提交.

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

$ git --version => 2.3.3
$ bundler --version => 1.7.9
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 27

必须有一些进程在后台运行,或者在shell中执行git命令的一些副作用正在修改Gemfile.lock.

我不熟悉rvm的魔法(虽然听起来似乎有道理); 这里有一些其他要检查的事情:

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

  • 谢谢,对我来说问题出在春天.在'spring stop`之后,我能够成功地`git checkout - Gemfile.lock` (9认同)
  • 是啊.我们在一个新的Rails 4.2项目中遇到了同样的问题,那就是Spring.太有帮助了! (2认同)
  • @BrunoPeres 不,下次运行启用 spring 的命令(例如 `rails` 或 `rake`)时,spring 将自动重新启动。 (2认同)

jro*_*ind 0

有时,运行rails命令或其他bundle exec命令会默默地更新您的Gemfile.lock。我猜你在 git 命令之间的某个时候会这样做。或者你安装了一些奇怪的东西,它在无形中做到了这一点。

(rvm 可以无形地做到这一点吗?我不知道。我认为 rvm 会做各种奇怪的事情并且不要使用它。)。

无论如何,发生这种情况的事实可能是其他事情发生的证据,而这并不是您想要的 - 您确定您尝试一起提交的 Gemfile 和 Gemfile.lock 实际上是兼容的吗?通常,每当 Gemfile 发生任何更改时,明智的做法是运行捆绑安装来获取新的 Gemfile.lock。如果您尝试提交实际上与 Gemfile 不兼容的 Gemfile.lock...我不确定您为什么要这样做,通常我希望任何给定提交中的 Gemfile 和 Gemfile.lock兼容的。

要了解为什么某些(神秘的)可能会更改 Gemfile.lock 的线索,请对 Gemfile.lock 执行 git diff 以查看它是如何更改的?