使用不同的node_modules文件夹进行git checkout

5

我有两个分支,一个叫做“gh-pages”,另一个叫做“master”分支。它们都有像“node_modules”这样的单独文件夹,但它们完全不同。而且它们是未跟踪的!

所以当像下面这样检出“gh-pages”分支时:

git checkout gh-pages

我需要一种方法来指定Git不仅应该删除(但保存)所有已跟踪的文件,还应该删除所有未跟踪的文件和文件夹(例如“node_modules”文件夹)从“master”分支中。然后从“gh-pages”分支加载所有已跟踪的文件和文件夹以及所有未跟踪的文件和文件夹。
是否有简单的方法,或者我真的需要为每个checkout删除未跟踪的文件和文件夹,以使这两个不相互交叉?
4个回答

5

1
这在git中是不可能的。按照定义,未跟踪的文件是文件系统的一部分,而不是git版本控制的一部分。
git checkout
更新工作树中的文件以匹配索引或指定树中的版本。如果没有给出路径,git checkout还会更新HEAD以将指定的分支设置为当前分支。
因此,当您检出一个分支时,您只会得到该分支中文件的工作副本。由于像node_modules这样的未跟踪文件不属于任何特定的分支,而是属于本地文件系统,因此它将保持原样。

你知道有什么解决方法吗?我的意思是,在GitHub上,使用不同的节点模块来创建gh-pages分支是一种常见行为。 - user3631654
1
将它们纳入您的版本控制系统并跟踪它们 :) - Aditya Singh
你不是认真的吧?在当前的项目中,大约有60MB的节点模块,超过14000个文件,而实际上只有66个源文件,大小只有176KB... - user3631654
1
你所寻找的东西如果没有在代码库中进行跟踪是不可能实现的。 - Aditya Singh

0

我也不得不选择git worktree来实现这个目的。以下是我如何逐步完成它的方法。

  1. 创建孤立分支gh-pagesgit checkout --orphan gh-pahes

  2. gh-pages分支创建一个git工作树。
    git worktree add <worktree_name> gh-pages

  3. 现在已经创建了一个名为<worktree_name>的新目录。进入该文件夹并运行npm install。更改到此文件夹等同于检出gh-pages分支。

  4. 现在,您可以开发您的Github Pages网站并将其推送到远程的gh-pages分支以部署它。


0

我也遇到了类似的问题,当升级package.json中列出的依赖项时(另一个分支可能仍然有旧的package.json),这也可能是一个问题,此时node_modules中的模块在切换分支后可能会处于错误的版本。

我的一个想法是设置本地git checkout钩子,每次切换/检出不同的分支或提交时运行npm ci。但是,这需要拥有/使用并跟踪/提交package-lock.json,而且在更大的项目上重新安装可能需要太长时间(在这种情况下,您可能需要尝试像pnpm这样的东西以加快安装速度)。

另一个想法是简单地使用yarn v2,然后提交所有依赖项/模块(我相信yarn将其存储在称为cache的本地位置)。此外,我可能是错的,但我相信您也可以运行npm ls,如果node_modules与项目/包清单不匹配,则会出现错误(不确定是否有很好的文档记录它做了什么和没有验证的细节)。


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