如果您在 wordpress 存儲庫上托管了一個插件,那么您將會相當熟悉 svn 及其一些命令。在本教程中,我將向您展示如何使用 git(另一個由 github 普及的版本控制系統)來發布和維護您的插件。
什么是 Git?
Git 和 SVN 都是版本控制系統的示例。 WordPress 的存儲庫使用后者(如果您有 WordPress 上托管的插件,您將熟悉“簽入”以對此存儲庫進行更改)。它們都允許您跟蹤代碼的更改,但它們之間的執行方式存在很大差異。
SVN 依賴于代碼的單個“中央存儲庫”(在我們的上下文中:WordPress 插件存儲庫)。每次您想要編輯插件時,都需要制作本地副本、進行更改,然后將這些更改“簽入”到 WordPress 存儲庫。
Git 是一個分散的版本控制系統。您不僅擁有插件的本地副本,還擁有插件存儲庫的完整克隆,并包含其所有更改。該存儲庫現在獨立存在于您的計算機上。您可以在本地計算機上提交并跟蹤更改、恢復更改或向不同方向“分支”插件。只有當您愿意更新插件時,您才會將更改推送到 WordPress 存儲庫以將其公開。
在本教程中,我假設您已在 WordPress 插件存儲庫上托管了一個插件,或者至少您的托管請求已獲得批準。如果您不確定如何讓 WordPress 托管您的插件,我建議您閱讀我們有關如何發布到 WordPress 插件存儲庫的文章。
使用 Git 相對于 SVN 有哪些優勢?
支持和反對使用 Git 而不是 SVN(以及一般的去中心化版本控制系統)有很多爭論。其中許多源于 Git 和 SVN 跟蹤更改的根本不同方式。 CodeForest 的 Git vs SVN 文章對 Git 和 SVN 進行了精彩、深入的分析,但對于 WordPress 開發人員來說:
- 離線訪問 – 您可以在自己的個人“開發存儲庫”上進行提交并跟蹤提交。僅當您想要公開更改時,才需要訪問 WordPress 存儲庫。
- 一旦您學會了 Git,就會更更容易使用 – 本文將引導您完成在存儲庫中進行更改和更新所需的基本工作流程。我在底部鏈接到了一些資源,其中提供了有關使用 Git 的更多詳細信息。
- GitHub – 讓我們面對現實吧,這就是我們大多數人聽說 Git 的方式。 Git 的去中心化特性使其能夠鼓勵“社交編碼”。您可以在 GitHub 上保留插件的副本,鼓勵社區參與并進行改進或擴展,然后您可以將其包括在內。一般來說,向其他開發人員公開您的插件是個好主意。
- 輕松“分支”您的插件 – 您可以在本地副本上創建“實驗”分支來測試可能的新功能,然后如果它們有效,則在發布下一個版本時將它們合并回來插件。
使用 Git 的一個缺點是讓它與 SVN 存儲庫很好地配合。由于 git svn,這實際上并不難,本文就是為了指導您完成它。
第1步下載Git
如果您還沒有安裝 Git,您需要安裝它。 Git 社區書籍和 Pro Git 書籍(如果您是 Git 新手,這兩個優秀資源)中詳細介紹了如何安裝 Git。如何安裝 Git 將取決于您的操作系統,以及您可以使用哪些 GUI 程序。在本教程中,我將通過命令行完成所有操作 – 我鼓勵您也這樣做。在文章的最后,我將推薦一些您可以使用的 GUI 程序,但通常,我只使用它們來幫助可視化存儲庫的分支。
第 2 步克隆插件的 WordPress 托管存儲庫
如前所述,使用 Git,您無需“簽出”插件的副本 – 您可以克隆存儲庫,并包含所做更改的歷史記錄及其所有分支和標簽。第 1 步是克隆插件的 WordPress 托管存儲庫。作為示例,我將根據之前的教程發布一個“帖子類型檔案鏈接”插件。因此(一旦您被 WordPress 存儲庫接受)打開您的命令行界面,然后導航到您想要存儲插件本地版本的位置。我將把它放在一個名為“Plugins”的文件夾中。一旦到達那里,我們想要告訴 Git 在哪里可以找到我們的插件。截至撰寫本文時,WordPress 存儲庫中托管著近 20,000 個插件,并且有超過 500,000 個修訂版本。我們不想等待 Git 遍歷每一個來找到我們的插件。因此,首先,我們找到插件的起始版本(我們希望它是整個歷史記錄)。為此,我們獲取插件的第一個日志(最初將其添加到存儲庫時):
svn log -r 1:HEAD --limit 1 http://plugins.svn.wordpress.org/your-plug-in-name
它會思考一段時間,然后你應該看到類似這樣的內容:
r520657 | plugin-master | 2012-03-19 03:56:31 +0000 (Mon, 19 Mar 2012) | 1 line
我的插件的第一個數字“520657”是第一個修訂版。我們將在下一個命令中使用它,告訴 Git 克隆我們插件的歷史記錄。將 XXXXXX 替換為您的修訂號。
git svn clone -s -rXXXXXX --no-minimize-url http://plugins.svn.wordpress.org/your-plug-in-name cd your-plugin-name git svn fetch git svn rebase
“-s”告訴 Git 期望 SVN 存儲庫的標準(標簽、主干、分支)布局。 ‘–no-minimize-url’ 會阻止它在插件文件夾之外查找。 確保它沒有丟失。如果您忽略它,您最終可能會復制整個 WordPress 插件存儲庫。 -rXXXXXX 告訴 Git 要查找的修訂版本。如果你忽略它,Git 將搜索存儲庫的整個歷史記錄。修改次數超過 500,000 次。我有一次遺漏了這個,花了大約兩個小時。安裝完畢后,應該只需要幾分鐘。
完成后,您應該會發現它在“插件”文件夾中創建了一個名為“您的插件名稱”的文件夾。讓我們來探索一下。導航到“您的插件名稱”文件夾并運行命令以查看存在哪些“分支”:
git branch -a
這將列出所有分支,本地和遠程。唯一的本地分支應該是 Master (星號表示這是您所在的分支)。其他分支是“主干”,如果有的話,每個標簽都有一個分支(SVN 將標簽視為分支,但 Git 比這更聰明)。
轉到“本地文件夾”“plugins/your-plugin-name”,您應該會看到插件文件(如果有)。在其中創建或編輯任何文件之前,我們將創建一個單獨的分支來處理。
更新:由于 Neerav 和 John Eckman 在下面的評論中指出的問題,上述命令已更新。上面的代碼現在反映了 Stephen Harris 的建議。
第3步(可選)推送到GitHub
使用 Git 的好處之一是您可以輕松地在 GitHub 上維護插件的版本。這使得其他開發人員更容易訪問您的插件,他們可能會提出改進建議,甚至進行自己的修改,您可以將其拉入您自己的存儲庫中。如果您已經設置了 GitHub,此時您可能希望將插件推送到您的帳戶。為此,首先在 GitHub 帳戶上為自己創建一個新存儲庫,然后將其作為遠程分支添加到本地存儲庫:
git remote add origin git@github.com:<your-user-name>/<your-repo-name>.git </your-repo-name></your-user-name>
“your-user-name”是指您的 GitHub 用戶名,“your-repo-name”是指您在其上創建的存儲庫的名稱GitHub。然后你只需推送本地存儲庫:
git push origin master
第 4 步編輯插件:工作流程概要
我們將創建一個新的分支“work”。我們將在這個分支內更改插件、進行更改并添加功能等。這意味著我們的“主”分支保持其原始狀態。這允許我們切換回 Master 分支,并再次分支。特別是,假設當您在“工作”分支中開發一些新功能時,您的插件中發現了一個主要錯誤。您可以切換回您的“主”分支(其中不包括您當前正在處理的任何功能),提交錯誤修復,然后將其推送到 WordPress 存儲庫。然后,您可以切換回工作分支并從上次中斷的地方繼續。 (注意:Git 不會創建文件的副本 – 您的本地文件夾中始終只有一組文件。這些文件包含的內容取決于您所在的分支。)
事實上,為要添加到插件中的每個新功能創建一個分支是個好主意。完成后,您只需將它們合并回主分支即可。如果這導致任何“沖突”,系統會要求您手動解決這些問題。
首先創建一個名為“work”的分支:
git branch work
然后“簽出”(轉到)分支“工作”:
git checkout work
一條消息將告訴您您已切換到“工作”分支。現在,使用您最喜歡的文本編輯器打開本地文件夾中的插件文件(如果還沒有任何文件,則創建它們)。創建一些文件后,您可能想查看更改了哪些文件。您可以使用簡單的命令來完成此操作:
git status
這將列出已跟蹤和未跟蹤文件的更改。可能存在您不希望 Git 跟蹤的文件(例如臨時文件),但如果您向該文件夾添加了任何新文件,則需要告訴 Git 跟蹤它們。您可以使用以下命令執行此操作:
git add <file-name></file-name>
我在本地文件夾中創建了兩個文件“post-type-archive-links.php”和“metabox.js”,因此我添加了他們告訴 Git 跟蹤他們。您必須確保您正在跟蹤您的自述文件。
您還可以查看自上次提交以來的更改(這是 GUI 程序變得非常方便的地方)
git diff
一旦您想要將更改提交到本地存儲庫:
git commit -a -m "Did abc to xyz"
提供提交中包含的更改的(詳細)消息。
在進行更改的過程中,您可以(并且應該)盡可能頻繁地提交 – 但以合乎邏輯的方式,最好為您所做的每件“事情”進行一次提交。您還應該確保您的提交中沒有明顯的錯誤。 “撤消”一次提交既快速又輕松:您可以通過執行另一次提交來逆轉前一次提交來完成此操作:
git revert HEAD
(系統會提示您輸入一條消息來描述此提交。)
第 5 步提交到 WordPress 存儲庫
假設您現在想要將所有更改推送到 SVN 存儲庫。在這樣做之前,我們需要記住一些事情。 Git 鼓勵您經常提交,對于開發而言,這樣做是一個很好的實踐。不過,您的 WordPress 插件存儲庫可供分發。它不需要每一次提交。事實上,正如 Otto(WordPress 核心貢獻者)警告的那樣,它也確實不想要它:
“如果我發現你[分別推送每個提交],那么我將禁止你訪問 WordPress.org。SVN 只需要提交你的最終工作版本,而不是數百個的整個歷史記錄。您使用 Git 所做的更改。將您的更改扁平化為單個提交。”
為了避免這種情況,當我們準備好推送到 WordPress 存儲庫時,我們會將所有提交合并為一個提交。有幾種方法可以做到這一點。我們將把工作分支中的更改合并(并同時壓縮)到主分支中。然后我們所有的更改都會作為主分支上的一次提交出現。然后我們刪除工作分支并將主分支推送到插件的 SVN 主干。
首先,我們要切換回 Master 分支:
git checkout master
然后將工作分支更改壓縮并合并到主分支中:
git merge --squash work
如果對主分支進行了更改,則合并中可能會出現沖突。系統會提示您在合并完成之前手動解決這些沖突。合并后,提交更改(這一提交將包含我們工作分支的所有提交):
git commit -a -m "Made changes a,b,c,d"
最后,我們刪除工作分支
git branch -D work
如果您有多個分支想要合并,那么您可以對每個分支執行此操作。還有一些替代方法可以扁平化您的歷史記錄(例如交互式變基),我不會介紹這些方法。
此時,如果您愿意,您可以將最新更改推送到您的 GitHub 帳戶:
git push -u origin master
要推送到 WordPress 存儲庫,我們首先確保我們的本地存儲庫是“最新的”:
git svn rebase
然后,Git 將獲取您的 subversion 存儲庫,并將其中的任何更改與我們剛剛所做的更改合并。通常情況下,WordPress 存儲庫不應有任何更改,因此您應該看到以下消息:當前分支 master 已更新。
現在我們可以將更改推送到 WordPress 存儲庫
git svn dcommit
然后,Git 可能會提示您輸入 WordPress.org 憑據。輸入后,您的更改將提交到 WordPress 存儲庫。很快您就會收到來自 WordPress 存儲庫的一封電子郵件,通知您提交情況。
第 6 步標記新版本
目前,這些更改將放在后備箱中。如果我們想標記插件的新版本怎么辦?為插件創建下一個版本時,您應該更新自述文件,以便穩定標簽指向您的新版本(例如“2.0”)。您還應該在 your-plug-in-name.php 文件中更新插件的標頭信息。如果您忘記執行此操作,只需執行上述過程并進行這些更改即可。
一旦您的“主干”完全更新(包括最新版本信息),我們只需在 WordPress 存儲庫中創建新標簽即可:
git svn tag "2.0"
這會將 trunk 中的所有內容復制到 tags/2.0 中(通常使用 svn cp trunktags/2.0 在 SVN 中實現的效果)。
如果您想在本地存儲庫中標記版本:
git tag -a 2.0 -m"Tagging 2.0"
第 7 步(可選)在 GitHub 上標記新版本
與我們對 WordPress 存儲庫所做的類似,確保我們的存儲庫同意,然后推送我們的更改和標簽:
git pull --rebase origin master git push origin master git push origin --tags
Git 命令的有用資源
- Git 參考(有一個關于“如何像 Git 一樣思考”的很好的部分)
- Git 社區書籍
- Pro Git 書籍
- Git Ready(與其說是指南,不如說是“片段”集合)
- SVN 到 Git 速成課程(如果您已經使用 SVN 一段時間,會有幫助)
- Git Magic(Git 的友好介紹)
最后,還有一些可能會派上用場的 Git “備忘單”:此處和此處。
GUI Git 程序
窗口
- TortoiseGit(與 Windows 資源管理器集成良好的流行程序)
- msysgit
蘋果電腦
- Git 塔
- GitHub for Mac(來自為您帶來 GitHub 的人)
Linux / 跨平臺
- GitG(這是我使用的)
- QGit
- Git Cola(跨平臺)