自迁移出 MediaWiki 以来,本页内容尚未经过审查。如果您愿意帮忙,请查看帮助指南!
This guide discusses how to modify an already-existing plugin, and contribute your changes back.
* If you are interested in developing a new plugin instead, see Writing plugins.
* If you have completed a plugin that you would like to share with the community, see Distributing your plugins.
简介
有时您可能想为已有的 ImageJ 插件或库做出贡献。例如,在一个插件中发现一个错误,您想要修复它,或者您想通过添加更多功能来改进一个库。本教程通过实际案例逐步介绍如何做到这一点。
在许多情况下,插件或库将在某处在线拥有自己的源代码存储库。例如,在 Fiji 项目中,插件代码位于 Fiji GitHub organization 中;例如,VIB-lib 库的存储库是 VIB-lib。这种结构允许轻松、独立地开发每个单独的组件。
本教程假设您熟悉Git。如果不是这种情况,请继续阅读现有的documentation。
在此示例中,我们想要修复一些错误并向 VIB-lib 库添加一些功能。让我们一步步看看如何做到这一点:
GitHub
在您最喜欢的浏览器中,登录您的 GitHub 帐户。如果您还没有帐户,请继续create one。
叉子
转到库的存储库(在本例中为https://github.com/fiji/VIB-lib)并“分叉”存储库(单击右上角的“分叉”按钮):

通过这样做,您将把整个存储库复制到您自己的 GitHub 帐户中。这样,您就可以使用现有存储库主分支的相同版本自由地使用该库。 更多详情请参见GitHub: how to fork a repository。
克隆
接下来,转到命令行,移动到工作区文件夹并克隆存储库:
$ git clone https://github.com/username/VIB-lib
(将“用户名”更改为您的 GitHub 帐户名)
配置遥控器
要将您在分支中所做的更改与原始存储库同步,您必须配置一个指向 Git 中的上游存储库的远程服务器。在我们的例子中:
$ cd VIB-lib
$ git remote add upstream https://github.com/fiji/VIB-lib
$ git fetch upstream
更多详情请参见GitHub: how to configure a remote fork和GitHub: how to sync a fork。
创建主题分支
使用描述性名称创建一个新分支。由于我们想要处理 AmiraMesh 文件,因此我们将其称为“amira-io”:
$ git checkout -b amira-io
发展
现在我们开发代码以将我们的更改包含在库中。
建筑
大多数 ImageJ 插件和支持库都是作为 Maven 项目开发的。开发人员通常更喜欢使用受支持的Integrated Development Environments之一来构建和运行代码。
最流行的IDE无疑是Eclipse,您可以按照this tutorial构建插件或库(您只需将URL从ImageJ存储库更改为适当的插件或库存储库URL)。
尽早提交,经常提交!
请记住:
- Make changes and commit them 到您的主题分支
- 将提交推送到您的 GitHub 存储库;例如。:
git push -u origin amira-io
拉取请求
最后,一旦您测试了新代码并对结果感到满意,您就必须建议将您的贡献添加到原始项目中。在 GitHub 中,您可以使用 拉取请求 来执行此操作:
首先,切换到您的分支:

然后单击比较和审查按钮:

开始审核后,您将看到一个审核页面,您可以在其中获得有关您的分支和存储库主分支之间到底发生了什么变化的高级概述。您可以查看对提交所做的所有评论,确定哪些文件发生了更改,并获取您分支的贡献者列表。
最后,当您准备好提交拉取请求时,单击 创建拉取请求:

更多详情请参见GitHub: how to send a pull request。
拉取请求讨论
拉取请求创建后,会自动发送给原始存储库的负责人。在查看基本描述、提交和累积差异后,负责应用更改的人员可能会提出问题或意见。 讨论视图旨在鼓励和捕获此类讨论:

修改你的提交
从讨论中,您可能意识到您需要修改在分支上所做的部分更改。您的提交引入的一些更改可以通过新的提交来修复(将出现在拉取请求的讨论视图中)。但某些提交可能需要修改,以便存储库的历史保持相当干净。在这种情况下,您需要使用git rebase command:
If you prefer using a graphical interface (e.g. Atlassian SourceTree or GitHub Desktop) instead of the command line, there are also options to do an interactive rebase. To force-push your amended commits to the existing branch on github though, the best option is to use the command line, see below.
Rebase 在一系列提交上运行。您为其提供一个起点,然后它会自动包含该点之后**的所有提交,直到分支的当前状态。
例如,您可以指定从以下位置开始的特定提交:
git rebase -i 6272a7bf
如果我们不确定从哪个提交开始,我们可以对整个分支进行变基:
git rebase -i $(git merge-base --fork-point main)
在我们的示例中,我们运行第一个命令,Git 立即启动我们的默认文本编辑器并打开一个文件,其中详细说明了我们选择的范围内的提交:
pick 36fc3d2 Use java.util.zip tools to decode (inflate) AmiraMesh files instead of zjlib methods.
pick 25b44e1 Encode (deflate) using java.util.zip methods instead of the zjlib ones.
pick 913d6e3 Remove unused imports.
pick 45adf88 Add progress bar updates.
pick 1d6e8d9 Make call to static method correctly.
pick 1c1f88f Correct typos
pick 478c271 Fix bug when reading AmiraMesh files.
pick ffeaab8 Allow Avizo files to be read as well.
pick a3e4aec Remove jzlib dependency, now unnecessary.
pick 7d18362 Allow Avizo files to be read as well.
pick e768fd1 Add method to write AmiraMesh file faster using more memory.
pick 88dbc1c Add method to read AmiraMesh file fast using a more memory.
pick 4e4c7a4 Make sure the files and output streams are closed after writing.
pick 86a79cf Make the output stream a class field so it can be properly closed as well after writing the file.
pick def586d Correct indention.
pick c536d3d Make sure the file and input stream are closed after reading.
# Rebase 6272a7b..054d243 onto 6272a7b
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
从上到下分析这些信息,我们可以看到:
- 列出了 16 个提交,这表明我们的起点和当前分支状态之间存在 16 个更改。
- 您选择变基的提交按最旧更改(顶部)到最新更改(底部)的顺序排序。
- 每行列出一个命令(默认情况下为 pick)、commit hash 和提交消息。整个 git rebase 过程以您对这三列的操作为中心。您所做的更改将重新基于您的存储库。
- 提交后,Git 会告诉您我们正在处理的提交范围 (6272a7b..054d243)。
- 最后,Git 通过告诉您在变基提交时可用的命令来提供一些帮助。
现在,我们可以更改十六行中任何一行的第一个单词,以应用六个可用的变基命令中的任何一个:pick、reword、edit、squash、fixup 和 exec。您还可以删除任何行(这样提交就会丢失)或重新排序以更改提交的顺序。
一旦我们使用每次提交所需的命令编辑完该文件,我们就保存它并关闭它。然后 Git 会自动处理每个提交,从最旧的开始,在每一步执行我们的指令。
- 标记为 pick 或 fixup 的提交不需要额外的输入
- 标记为 reword 或 squash 的提交将导致变基过程暂停,打开一个文本编辑器,您可以在其中适当更新提交消息。保存并关闭此文本文件后,变基会自动继续。
- 标记为 edit 的提交也将暂停变基过程,暂时将控制权恢复到终端。在这种情况下,我们会在代码的这种状态下进行所需的任何更改。可以添加更改并用于正常创建新提交,和/或使用以下命令将更改合并到当前预先存在的提交中:
git commit --amend提交任何必要的更改后,可以通过调用以下命令继续变基:
git rebase --continue如果我们在编辑提交时犯了错误,我们总是可以使用以下命令撤消整个过程:
git rebase --abort当变基过程完成后,我们应该在命令行中看到以下消息:
$ Successfully rebased and updated refs/heads/main.此时,如果我们对变基感到满意,我们应该将更改推回远程分支:
git push origin +HEAD请注意,此命令中的“+HEAD”告诉 git 覆盖远程分支,类似于force push。
如果我们对变基后的状态不满意,我们可以使用以下命令重置本地分支:
git reset --hard $(git rev-parse --abbrev-ref --symbolic-full-name @{u})
关闭拉取请求
一旦参与对话的所有开发人员都对分支的状态感到满意,存储库的负责人将合并并关闭拉取请求:

另请参阅
本教程是使用以下参考文献编写的: