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

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

$ git checkout master $ git pull --rebase 

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

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

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

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

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

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

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

必须在后台运行某个进程或在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

有时运行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来看看它是如何改变的?