Yarn: 应该将yarn.lock 视为git 中的二进制文件吗?

创建于 2016-11-10  ·  19评论  ·  资料来源: yarnpkg/yarn

最有用的评论

到目前为止对我有用的方法是这样的:

git rebase origin/master

当第一个冲突出现时,我检出yarn.lock然后重新执行安装

git checkout origin/master -- yarn.lock
yarn install

这会根据yarn.lock的原始/主版本生成一个新的yarn.lock ,但包括我对package.json所做的更改。 那么这只是一个问题:

git add yarn.lock
git rebase --continue

我又回来做生意了。

所有19条评论

不,不应该。 该文件是纯文本文件,文件中可能存在您可能需要解决的合并冲突。

文档中写着不应该触及yarn.lock 文件以避免出现问题,只有yarn 本身应该处理它。 那么我如何解决合并冲突?

@kittens当存在冲突以

@dbashford把它吹走并重新运行纱线的问题是你会得到比你想要的更多的变化。 例如,波浪号版本将升级,即使您没有运行yarn upgrade

@dbashford然后更容易放置纱线。 在 gitignore 中锁定文件

到目前为止对我有用的方法是这样的:

git rebase origin/master

当第一个冲突出现时,我检出yarn.lock然后重新执行安装

git checkout origin/master -- yarn.lock
yarn install

这会根据yarn.lock的原始/主版本生成一个新的yarn.lock ,但包括我对package.json所做的更改。 那么这只是一个问题:

git add yarn.lock
git rebase --continue

我又回来做生意了。

请注意,即使您没有手动解决合并冲突,将其设为非二进制文件也意味着您可以看到合并冲突,这仍然是有价值的信息。

相关的,即使有 _no_ 合并冲突,我们是否总是可以假设 git 已经以导致有效/正确文件的方式合并了一个 yarn.lock 文件的两个版本? 如果 yarn 是唯一应该管理其内容的工具,那么让 git 更新文件的内容似乎是错误的。

我不确定自动合并 YAML 总是会产生一个有效的文件,尤其是在以下情况下:

  • 包中的多个主要版本在锁定文件中彼此相邻
  • 两个相邻条目的第一行在解析为相同或相似版本时可以同时更改:
readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.2.2:
  version "2.2.2"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e"
  dependencies:
    buffer-shims "^1.0.0"
    core-util-is "~1.0.0"
    inherits "~2.0.1"
    isarray "~1.0.0"
    process-nextick-args "~1.0.6"
    string_decoder "~0.10.x"
    util-deprecate "~1.0.1"

readable-stream@~2.1.4:
  version "2.1.5"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0"
  dependencies:
    buffer-shims "^1.0.0"
    core-util-is "~1.0.0"
    inherits "~2.0.1"
    isarray "~1.0.0"
    process-nextick-args "~1.0.6"
    string_decoder "~0.10.x"
    util-deprecate "~1.0.1"

@IanVS感谢您的演练! 但@idris的担忧仍然适用于这个解决方案。 您最终会以这种方式升级很多依赖项,这可能出乎意料。

@danny-andrews 你能解释一下吗?

当您清除yarn.lock并重新运行yarn install ,整个yarn.lock将使用满足package.json指定的版本范围的最新版本的依赖项重新构建,有效地升级自上次运行yarn install以来发生变化的任何依赖项。

这就是为什么我建议git checkout origin/master -- yarn.lock而不是删除yarn.lock 。 这会将您的yarn.lock重置yarn install仅更新您的package.json (当然还有它们的子部门)中已更改的包.

@IanVS是的,这是正确的做法。

虽然我推荐git checkout -- yarn.lock ,它更通用,只是将其重置为您当前分支上提交的任何内容。

好点,@idris。 我通常会变基到 master,这是我上面使用的示例,但情况并非总是如此。

@IanVS我不明白那个命令做了什么。 这比我一直在做的手动复制和粘贴yarn.lock好得多。 感谢分享!

这是相关的:#3544

@IanVS的方法与将yarn.lock之上重放你的yarn install

这是我的方法,添加一个 bash 脚本

#!/usr/bin/env bash
export GIT_TRACE=1
git checkout origin/master -- Pipfile.lock Pipfile
git commit -m "fetch to branch Pipfile.lock, Pipfile from origin/master" -- Pipfile.lock Pipfile
read  -n 1 -p "Do your changes in Pipfile and press Enter ..."
pipenv lock --clear
git commit -m "re-apply changes to Pipfile.lock, Pipfile" -- Pipfile.lock Pipfile
echo "Done"

此页面是否有帮助?
0 / 5 - 0 等级