我该如何使用git来管理项目模板?

24

我有一些模板/起始代码,我在项目中一再重复使用。但在新项目中工作时,我总是想在模板中增加和更改一些内容。我猜应该与项目一起开发模板。

我的一些添加是特定于项目的,不应提交给模板。其他则应该提交。

我猜我可以用git来处理这个问题,但我不确定怎么做。我已经为模板和每个项目都创建了一个git存储库。我希望我所做的一些提交能够推回模板,但不是所有提交。我该如何制定一些不需要提交回去的文件呢?我应该在一个分支中处理特定于项目的事情,而在主分支上处理模板吗?

非常感谢您的任何见解。我的谷歌检索结果很少。


根据需要分支和合并中央模板分支? - Kzqai
1
可能是重复的问题:如何在Git中跟踪共享公共代码的多个项目? - Chris Johnsen
在GitHub上,自2019年6月以来,您现在可以使用存储库模板:请参见“我可以从现有存储库创建一个新存储库,但重命名它吗?”。 - VonC
3个回答

15
我建议为您想要进行的任何模板更改创建一个特定的分支。但请确保从早期提交之一开始,以便您不会将项目特定的更改应用于您的模板。例如:git checkout -b template_changes EARLY_COMMIT_SHA。 然后,您已经进行的任何模板更改都可以使用cherry-pick命令添加进来:git cherry-pick TEMPLATE_CHANGE_SHA
任何未来想要进行的模板更改都可以在模板分支上进行,并合并到项目的其他分支中;但如果您已经很远了,您可能会想切换到模板项目。
要将您的模板更改从项目推送到模板git存储库中,您可以使用git format-patch SHA_FROM_WHERE_TEMPLATE_BEGAN命令。这将创建一堆补丁文件,您需要将它们复制到模板repo中并运行git apply 0001-... 0002-...来应用这些补丁,但这并不好玩。
更高级的做法是将模板存储库添加到项目存储库中:git remote add template /path/to/template/repo。如果模板分支存在,您可能需要使用-t-m选项,或使用git remote set-head template template_branch:master命令(或其他类似的命令)。然后,您就可以使用git push template template_branch命令将更改推送到模板存储库。如果template_branch的头未正确设置,则需要使用git push template template_branch:master
希望这对您有所帮助。祝您玩得愉快!

谢谢。我认为这为我提供了一些更多研究的正确方向。 - Joel

0
如果您使用yarn或npm,您可以拥有一个带有自己的提交历史记录的模板存储库,并稍后将其fork到一个新项目中,然后通过一个(有技巧的)命令在新fork的项目中重置提交历史记录。
我使用的是yarn gitinit。

package.json:

    "scripts": {
      "gitinit": "git checkout --orphan tmp-master && git add -A && git commit -m 'inicial' && git branch -D master && git branch -m master && git push -f origin master "
    }

如果你不使用npm或yarn,模板中的自定义脚本文件也可以完成相同的工作。

0

我也有同样的问题。我主要使用 Django 和 Flask 项目,这带来了无尽的变化(例如 Flask/MongoDB/Vues.js 等)。我也喜欢使用 Docker。因此,我将我经常使用的主要变化模板化为Docker项目。但是,特别是在Django中,你总是会遇到一些必须做的事情(例如运行 startproject/startapp/collectstatic)。

我基本上使用 this answer 这个答案来处理相同repo的不同分支的不同upstream问题。

开始一个新项目,我通常会这样做:

  1. [本地创建新目录]
  2. [在github上创建空项目repo]
  3. git clone [模板repo url]
  4. git checkout -b work
  5. git remote add project [项目repo url]
  6. git push project work
  7. git branch -u project/work work

所以基本上,我在新目录中克隆我的模板存储库。这给了我一个跟踪模板存储库的主分支(3)。然后,我立即创建一个工作分支(实际上将用于项目)(4)。我添加一个新的远程(即我的空项目在github上的存储库)(5)。这很关键 - 我push project work,这会在新的(之前为空的)项目存储库上创建第一个分支。

最后,为了使其永久化,我将工作分支设置为跟踪项目存储库上的工作分支。(6)

主分支已经跟踪模板存储库上的主分支,因此您无需在那里进行任何操作。

然后,如果我在工作分支上并决定要更新我的模板,我可以简单地提交我正在做的任何事情,切换到主分支,进行更改和提交推送到我的模板。它将推送到origin/master。或者我可以等待并积累一些对我的模板进行微小更改,测试它们,然后仅更新模板。

如果我已经深入到项目中(因此不太可能再进行模板更改),我可以简单地停止跟踪origin/master并重新配置项目以拥有主分支,或者只保留工作作为我的主分支。


我相信你可以通过执行 git push -u project work 来合并第6步和第7步。 - solarshado

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