0

在使用 Javascript 进行开发时,作为一种实践,我们在服务器上上传了缩小的 JS,因此我只想在我的主分支中保留缩小的 JS,同时我在本地(私有)分支上进行更改。有没有一种简单的方法可以只将缩小的 JS 从本地分支合并到主分支?

Cherry Pick 提交不起作用,因为我不希望合并我私人提交中的所有文件。这种方法建议从一个分支中提取特定文件以在另一个分支中提交,我想知道是否有一种设置/替代方法可以自动执行此操作,即合并只需要缩小的 js 文件(* .min.js)?

4

1 回答 1

1

听起来您的文档根目录中有一个远程存储库,您正在推送该远程存储库并将其用作实时站点的部署机制。我想说,在文档根目录中有一个 git repo 并不是一个很好的部署方式。(任何人都可以克隆你的整个仓库,包括你的整个提交历史和可能令人尴尬的未发布代码。)也许你有不同的设置,但我会根据你写的内容进行这个假设。

相反,如果您使用 post-receive 钩子提取master到您的文档根目录,但让您的 git repo 存在于其他地方,那么您可以毫无顾忌地存储您的缩小和非缩小 JS 源。

将您的 git 存储库移出登台服务器上的文档根目录。

.git/hooks/post-receive您的登台 Web 服务器上:

#!/bin/sh
GIT_WORK_TREE=/path/to/your/docroot git archive master --format tar | tar -x "*.min.js"

这将导致git将分支的干净副本导出master到您选择的目录。它将通过管道来执行此操作tar,您可以使用它来准确过滤您想要输出的文件以及您不想要的文件。post-receive是一个 shell 脚本,所以你可以在这里尽情发挥,在部署后添加后续行来做任何你想做的家务。

所以,以上是我建议你做的。如果您仍想继续在您的主分支中只保留一部分文件,您可以使用您在 shell 脚本中链接到的方法。

假设您的本地分支名称是local,并且您想要“部署”到的所有master内容都已提交,请创建一个deploy.sh.gitignore如果需要,可以添加):

#!/bin/sh
git checkout master
git diff-tree --name-only -r local | grep ".min.js$" > temp_file_list.txt
git checkout local `sed 'N;s/\n/ /' temp_file_list.txt`
git commit -m "Selective 'merge' of minified js from my local branch"

然后,deploy.sh只要您想使用更改的 .min.js 文件更新 master ,您就可以运行。如果您使用的是 Windows 并将本地文件保存为 DOS 格式,则应将\r\n而不是仅\n放在上面的sed命令中,并安装基于 bash 的命令行 git 工具。

于 2013-02-08T20:00:31.573 回答