我认为使用git-worktree
和从单独的分支部署是更清晰的选择,因为我不会在我的main
分支中有来自重新部署的提交混杂其中,这样更简洁。如果我使用git subtree
,每次都要删除远程分支,这是不必要的。
git-worktree
将您的子目录dist
(以此示例)挂载到一个单独的分支gh-pages
中。
以下是操作步骤:
git branch --track gh-pages origin/gh-pages
git checkout --orphan gh-pages
git reset --hard
git commit --allow-empty -m "Init"
git checkout main
git worktree add dist gh-pages
dist
是一个类似于 npm
构建脚本的东西:
"scripts": {
...
"dist": "ng build --configuration production && echo 'gitdir: /home/<user>/<repo>/.git/worktrees/dist' > ./dist/.git"
...
}
它所做的只是重新创建
git-worktree
引用,因为默认情况下
ng build
会删除
dist
中的
.git
文件。这个引用是
git
将
dist
链接到索引所需的。
工作流程大致如下:
npm run dist
cd dist
git add .
git commit -m "v0.0.3"
git push
如果你运行
git status
,它会回复
On branch gh-pages
。
而
git log
将显示一个提交
"Init"
。
但是当你cd ..
并再次运行git status
时,响应将是On branch main
。
而git log
将显示所有原始提交到main
的内容。
所以这里发生的事情非常有趣。文件夹dist
现在有一个单独的分支,具有自己的、与main
无关的历史记录,
而要切换的所有操作只需cd dist
即可访问该分支(gh-pages
)。
这与git checkout dist
不同,后者会将自动生成的构建文件附加到您的工作树中的dist
目录中,混合您的main
和部署历史记录,这很不方便。
在这里,您的src
文件将保持不变,连同它们在main
或cd ..
中的历史记录,只有部署所需的文件将位于此分支上,这非常方便,因为它将src
历史记录与部署历史记录分开。
现在,您将不再从文件夹部署,而是从一个分支部署,该分支在GitHub页面中保存了您站点的最新编译版本,并且是从/(root)
构建的。
index.html位于build/下,因此我想将其设置为默认的www路径。
在这里,请确保您创建的存储库是<username>.github.io
。我犯了同样的错误,使用了不同的存储库名称,感到非常沮丧。
因此,当用户访问username.github.io时,它会呈现该子目录中的内容,但它不会在URL上显示“/build/”,因为它被设置为根文件夹。
当然,这里可能还有改进的空间。例如,使npm run dist
执行所有这些操作,但我个人更喜欢手动执行这些步骤。
关于该方法的更多信息,请点击此处。
但是,我同意如果您正在团队中工作,最好使用像gh-pages这样的工具来强制执行项目中的标准。
我希望我的解释也能对提供某些贡献,而不仅仅是对上述方法的重新陈述。