跳轉到內容

ROSE 編譯器框架/Git

來自華夏公益教科書

ROSE 專案經歷了多個原始碼內容管理階段,從 CVS 開始,然後是 Subversion,現在是 Git。

Git 由於其獨特的功能成為官方的原始碼版本控制軟體,包括

  • 分散式原始碼管理。開發人員可以擁有一個獨立的本地倉庫,在任何他們想要的地方進行工作,而無需連線到中央倉庫。
  • 輕鬆合併。使用 Git 合併非常簡單。
  • 備份。由於中央倉庫的輕鬆克隆可以作為獨立的倉庫。我們不再擔心丟失中央倉庫。
  • 完整性。Git 使用的雜湊演算法確保您獲得放入倉庫中的內容。

許多其他著名的軟體專案也經歷了類似從 Subversion 切換到 Git 的過程,包括

有關 Git 使用者的更完整列表,請訪問 https://git.wiki.kernel.org/index.php/GitProjects

總之,Git 是最先進的原始碼管理工具。

用於 github.com 的 git 1.7.10 或更高版本

[編輯 | 編輯原始碼]

github 要求 git 1.7.10 或更高版本,以避免 HTTPS 克隆錯誤,如 https://help.github.com/articles/https-cloning-errors 所述。

Ubuntu 10.04 的軟體包倉庫中包含 git 1.7.0.4。因此需要構建更高版本的 git。但您仍然需要舊版本的 git 來獲取最新版本的 git。

 apt-get install git-core

現在您可以克隆最新的 git

 git clone https://github.com/git/git.git

安裝從原始檔構建 git 所需的所有先決條件軟體包(假設您已經安裝了 GNU 工具鏈,包括 GCC 編譯器、make 等)。

 sudo apt-get install gettext zlib1g-dev asciidoc libcurl4-openssl-dev
 $ cd git  # enter the cloned git directory
 $ make configure ;# as yourself
 $ ./configure --prefix=/usr ;# as yourself
 $ make all doc ;# as yourself
 # make install install-doc install-html;# as root

從 Subversion 使用者轉換

[編輯 | 編輯原始碼]

如果您來自集中式系統,您可能需要忘記一些您習慣的事情。

  • 例如,您通常不會從中央倉庫簽出分支,而是克隆整個倉庫的副本供自己本地使用。
  • 此外,Git 不使用小的連續整數來標識版本,而是使用密碼雜湊 (SHA1),雖然通常您只需要寫下雜湊的前幾個字元——足以唯一標識一個版本。
  • 最後,要習慣的最大事情是:所有 (!) 工作都在本地分支上完成——在 DSCM 世界中,沒有直接在中央分支上工作或直接將您的工作檢入中央分支這樣的概念。

話雖如此,分散式版本控制是集中式版本控制的超集,一些專案(包括 ROSE)設定了中央倉庫作為共享程式碼的策略選擇。當開發人員在 ROSE 上工作時,他們通常會從這個中央位置克隆,當他們進行更改後,他們通常會將這些更改推送到同一個中央位置。

Git 規範

[編輯 | 編輯原始碼]

名稱和電子郵件

[編輯 | 編輯原始碼]

在您提交本地更改之前,您必須確保已正確配置您的作者和電子郵件資訊(在您的所有機器上)。擁有一個可識別且一致的姓名和電子郵件將使我們更容易評估您對我們專案的貢獻。

指南

  • 姓名:您必須使用您在工作/業務中常用的正式姓名,而不是無法被同事、經理或贊助商輕鬆識別的暱稱或別名。
  • 電子郵件:您必須使用您在工作中常用的電子郵件。它可以是您的公司電子郵件或您的個人電子郵件(Gmail),如果您確實在業務中常用該個人電子郵件。

要檢查您的作者和電子郵件是否已正確配置

  $ git config user.name
  <your name>

  $ git config user.email
  <your email>

或者,您也可以只鍵入以下內容來列出您當前的所有 git 配置變數和值,包括姓名和電子郵件資訊。

  $ git config -l


要設定您的姓名和電子郵件

  $ git config --global user.name "<Your Name>"
  $ git config --global user.email "<your@email.com>"

分支命名規範

[編輯 | 編輯原始碼]

所有開發人員中央倉庫分支都應使用以下模式命名

  • 登入名-目的-選項
    • NAME 通常是登入名或姓氏。
    • PURPOSE 是對該分支上執行的工作型別的單字描述,例如“bugfixes”。
    • OPTION 是有關您分支的 ROSE 機器人的資訊。
      • -test 對分支的更改將自動測試
      • -rc 更改將被測試,如果透過則將合併到“master”分支(如 Subversion 中的“trunk”)。
  • 示例
    • “matzke-bugfixes-rc”分支由 Robb Matzke “擁有”(即,他通常是該分支的更改者),它可能只包含錯誤修復或微小的編輯,並且正在被自動測試併合併到主分支中,最終釋出給公眾。

提交訊息

[編輯 | 編輯原始碼]

擁有簡潔準確的提交訊息對於幫助程式碼審閱者完成工作非常重要。

提交訊息示例,摘自 連結

(Binary Analysis) SMT solver statistics; documentation

* Replaced the SMT class-wide number-of-calls statistic with a
  more flexible and extensible design that also tracks the amount
  of I/O between ROSE and the SMT solver.  The new method tracks
  statistics on a per-solver basis as well as a class-wide basis, and
  allows the statistics to be reset at artibrary points by the user.

* More documentation for the new memory cell, memory state, and X86
  register state classes.
  • (必需) 摘要:提交訊息的第一行是提交的一行摘要(<50 字)。以一個主題開頭,用括號括起來,表示該提交所代表的專案、功能、錯誤修復等。
  • (可選)使用專案符號列表(使用星號,*)逐項詳細說明提交

另請參閱 http://spheredev.org/wiki/Git_for_the_lazy#Writing_good_commit_messages

透過 git-push 在遠端倉庫上建立和刪除分支。

這是其一般形式

$ git push <remote> <syntaxhighlight-ref>:<destination-ref>
  • 當您克隆倉庫時,預設的<remote>稱為“origin”
  • The<source-ref>是您本地倉庫中的分支(從<remote>克隆)您想要建立或與<remote>
  • The<destination-ref>是您想要在<remote>

建立遠端分支

[編輯 | 編輯原始碼]

示例

$ git remote -v
origin	https://github.com/rose-compiler/rose.git (fetch)
origin	https://github.com/rose-compiler/rose.git (push)

$ git branch
* master

# Method 1
$ git push origin master:refs/heads/master

# Method 2 - The currently checked out branch (see git-branch) is also called the <tt>HEAD</tt>
$ git push origin HEAD:refs/heads/master

# Method 3 - Git is pretty smart -- if you only specify one name, it will use it as both
# the source and destination.
$ git push origin master

刪除遠端分支

[編輯 | 編輯原始碼]

刪除遠端分支只需不指定任何內容作為<source-ref>. 要刪除分支my-branch, 請使用以下命令:git-push命令

$ git push origin :refs/heads/my-branch

建議在推送工作之前對分支進行變基。 這樣您的本地提交將被移動到最新 master 分支的頭部,而不是與 master 分支的提交交織在一起。

git pull origin master
git rebase master

來自 http://gitready.com/intermediate/2009/01/31/intro-to-rebase.html

變基有助於將提交切片並以您希望的方式排列,並將它們放置在您希望的位置。 您可以使用此命令實際重寫歷史記錄,無論是重新排序提交、將它們壓縮成更大的提交,還是完全忽略它們,只要您願意。

這有什麼用呢?

  • 最常見的用例之一是您一直在不同的分支上處理自己的功能/修復等。 與為每個被帶回 master 分支的更改建立難看的合併提交不同,您可以建立一個大的提交,讓變基處理將其附加。
  • 變基的另一個常見用途是從專案中拉取更改並使您自己的修改保持一致。 通常,透過進行合併,您最終會得到一個歷史記錄,其中提交在 upstream 和您自己的提交之間交織在一起。 進行變基可以防止這種情況,並使順序保持更加合理的狀態。

修改子模組

[編輯 | 編輯原始碼]

ROSE 使用子模組連結到 EDG 檔案。

預設簽出的子模組版本位於一個幽靈分支上

  [youraccount@yourmachine:~/rose/src/frontend/CxxFrontend/EDG]git branch
  * (no branch)
    master

您必須在更改子模組之前建立一個本地分支,您應該基於幽靈分支建立一個新分支,該分支可能與遠端 master 相對應,也可能不對應。 在我們的設定中,我們將 EDG 更改推送到非 master 分支,因此幽靈分支很可能與非 master 分支相關聯。

$ git checkout -b fix-up

進行您更改後

始終先提交併推送子模組更改

  $ git commit -a -m "Updated the submodule from within the superproject."  // commit locally
  $ git push origin HEAD:refs/heads/your-account/edg4x-rc  // push to your own remote branch

最後更改超級專案的連結,使其指向已更改的子模組

  $ cd ..           # back down to its parent repository's path
  $ git add EDG  # Please note: NEVER use "git add EDG/"  !!!! , this will add all files under EDG/ to the super project!!
  $ git commit -m "Updated submodule EDG."
  $ git push

參考資料

[編輯 | 編輯原始碼]
華夏公益教科書