本文章是由機器翻譯。

資料點

Git:它是只是資料 !

Julie Lerman

下載代碼示例

Julie Lerman在資料列中的原始程式碼管理嗎?啊,但那原始程式碼時只是一個大的資料庫,這是一個邀請一些資料令人討厭的樂趣。很明顯,你應該知道前面我不寫關於 Git 本月因為我是一個專家的權利。事實上,我正在寫關於 Git 因為我一直用它。我有點貧血 GitHub 設定檔是證明了這一事實。當 Git 的話題的時候時,我傾向于改變這個話題,以免被發現我 Gitlessness — — 正如大部分的開發商朋友與它交互一眨不眨。

同時談論我 Gitless 生活最近與朋友和當地的 Ruby 開發者,Alan皮博迪 (github.com/alanpeabody),在當地駭客幸運的時刻,他對我說,"但朱莉,它僅僅是資料而已"。資料嗎?"哦,我愛的資料 !告訴我更多 !皮博迪描述如何 Git 依賴于資料庫充滿了鍵/值對,然後建議,而不嘗試使用可用的使用者介面工具或所謂的"瓷"命令以使用 Git,我探索和玩的較低級別"管道"命令和 Api。

所以 Git 有一個資料庫和訪問水暖 !皮博迪的建議絕對啟發了我。 現在,我花了一些時間來研究 Git 在較低的工作,如何讀取和寫入資料表示存儲庫中的活動,以及在 Git 中不同的物件類型與的有關。我還遠遠沒有專家卻感受到更多控制在 Git 上的我自己的活動。更重要的是,我玩開心玩 git,不再害怕它作為源的黑魔法。

如果此路徑吸引你,我建議你不會錯過在線上"臨 Git"書中的Scott查孔 (Apress,2009年)"Git 基礎知識"和"Git 內件"章節和發售 git-scm.com/書

我敢肯定 Git 資料庫向我指出,但只有在通過前後雖然我已經被淹沒的學習曲線。現在,我計畫去找點樂子了。對於本文的其餘部分,我只是它跟蹤一些代碼與資料庫進行交互,看它是如何影響資料庫中表示存儲庫。

而不是使用一個新的空的存儲庫開始,我將使用現有的存儲庫,我已經玩:很早期的工作在Entity Framework7 主辦了在 GitHub.com/aspnet/Entity­框架。請的記住這是一個迅速變化的專案在我寫這個專欄,所以在這裡工作的檔可能會更改的時間。

我會從 Windows PowerShell,利用豪華 git,增強了命令列的體驗與額外的狀態資訊、 色標的圖例和選項卡完成執行的命令。您可以找到此設置在本文附帶的下載說明。

獲取一個存儲庫和審查 Git 資產

第一步是複製現有的資源庫,我現有的 github 資料夾中啟動和使用 git 克隆命令:

D:\User Documents\github> git clone git://github.com/aspnet/EntityFramework

本身,這第一步提升我的 Git 技能 !Git 使用存儲庫的名稱,所以我得到 D:\User Documents\github\EntityFramework 我起始目錄中創建一個新資料夾。在克隆的過程中,如果您在檔資源管理器中打開 EntityFramework 資料夾儘快創建,您將看到.git 子資料夾首創。這是存儲庫中,就是我們所說的 git 資料庫。Git 使用此資料構建什麼一向指為工作目錄中,那就是,其餘的 EntityFramework 資料夾中的原始程式碼。

操作完成後,新的資料夾,EntityFramework,看起來很像任何其他Visual Studio解決方案資料夾,除了一件事:.git 資料夾本身,即,克隆的存儲庫,包括所有分支機搆的完整副本。注意到在其檔結構圖 1。在 Git 中,一個分支是只是一個指標到提交和提交是一個指標,指向一個快照您的工作目錄。儘管一個 Git 倉庫"主要"分支被稱為大師,在預設情況下,這不是一項要求。它們的預設分支,指向一個分支的 EF 團隊集他們命名為開發使用分支,您可以修改和測試代碼安全之前將更改合併到其他分支。

通過克隆存儲庫,包括存儲庫本身.git 資料夾中創建的解決方案資料夾
圖 1 通過克隆存儲庫,包括存儲庫本身.git 資料夾中創建的解決方案資料夾

其餘的 EntityFramework 資料夾內容代表的工作目錄。在某種程度上,你告訴 Git 來跟蹤您已經添加、 更改或刪除在您的工作目錄中的檔。這稱為"分期"— — 也就是說,對這些檔的更改是分階段和準備提交。階段性的變化都存儲在資料庫中,並將在那裡後你已經犯下他們。最終,你推這些更改高到伺服器。我不會處理這篇文章中的步驟,因為我的重點是探討資料庫活動。有樹和分叉,引用和標題,我還為這次旅行不理會其他概念。

所以什麼和該資料庫在哪裡嗎?它是關係資料庫,如SQL Server或 SQL CE 嗎?不行。它是代表了 Git 物件的檔的集合。每個檔稱為雜湊值,並包含雜湊的內容。請記住資料庫是一組鍵/值對。檔案名是鍵,它表示該物件在資料庫中,和它的內容很有價值。這些物件的集合包含了資料庫中表示存儲庫。每個鍵/值對存儲在.git/物件資料夾中,與他們的主清單存儲在一個稱為索引檔中。有跟蹤的不同分支的其他物件。它是可能很多檔都只是重複和從未編輯過。Git 有指向這些檔,而不是維護單獨的副本,使得從腹脹 Git 資料庫的方式。

但有沒有要還,看到的目的檔,因為最初,一切都被壓縮在包檔以及對應的 IDX。這些都是包子資料夾中所示圖 2

你不會看到圖 2 物件在第一次 — — 他們都壓縮成一個包檔’re All Compressed into a PACK File
你不會看到圖 2 物件在第一次 — — 他們都壓縮成一個包檔

Git 關於我的代碼知道什麼?

在開始編輯之前,我想看看 Git 瞭解關於我的工作目錄和存儲庫。這意味著要回 Windows PowerShell 並且啟用豪華 git 來增強我的 Git 命令列體驗。通過更改目錄到 EntityFramework 資料夾 (cd EntityFramework,就像 DOS 舊日的好時光) 開始辣妹 git 將看到.git 子資料夾以及從事 Windows PowerShell 環境。圖 3 顯示 Windows PowerShell 窗外現擁有豪華標題 ~ git 和提示黃色括弧中顯示的狀態 — — 那些豪華 git 功能。目前,它指示我的工作目錄使用稱為 dev EF7 資料庫的主要分支的分支。當我克隆存儲庫中時,在預設情況下 Git"簽出"這個分支,就是它放在我的工作目錄的版本。這是真的那簽出到 Git 的手段。它生成指定的分支中的工作目錄。一個有趣的練習是刪除一切,但.git 資料夾中檔資源管理器,然後類型"git 結帳 dev"在 Windows PowerShell 看到目錄內容得到完全重新創建。如果你想要證明它不來自該伺服器,將從互聯網拔出。

Windows PowerShell 與豪華 git 活性炭
圖 3 Windows PowerShell 與豪華 git 活性炭

我可以問 Git 它知道關於我的"地位"git 命令的工作目錄。所有的 git 命令通過定址 git 啟動,因此請鍵入:

git status

它採取回應並顯示消息:

On branch dev
nothing to commit, working directory clean

有道理。我開始用一個乾淨的石板。

看到 Git 如何回應編輯你的工作目錄檔

現在是時候開始敲打著要看這種地位改變的東西。

我會編輯我最喜歡的 EF 類之一:DbCoNtext.cs (這是在 src\EntityFramework 中)。我甚至不會費心Visual Studio。您可以只使用 NotePad + + 或您喜愛的文字編輯器。

我在頂部添加注釋:

// Julie was here

並保存。

當我再次運行 git 狀態時的反應是現在更有趣的,作為圖 4 顯示。

狀態後修改的檔中的工作目錄 (紅色字體表示工作目錄狀態)
圖 4 狀態後修改的檔中的工作目錄 (紅色字體表示工作目錄狀態)

Git 看到 (不幸的是硬讀紅色字體中指出) 的檔已更改,但它不上演。換句話說,Git 不然而,跟蹤它,但已經比較工作目錄檔到其資料庫來做這個決定。通知還為開發新的提示狀態是 + 0 ~ 1-0。 狀態顯示為紅色反映的工作目錄,在這裡 (指 0 新檔、 1 修改後的檔和沒有被刪除的檔。

資料庫呢?如果你看檔資源管理器中,您將看到由其時間戳記和索引檔並沒有改變的尺寸。什麼也在物件資料夾中,也改變了。Git 資料庫是變化的不知道我的工作目錄中。

親愛的 Git,請現在跟蹤我的檔

Git 不會追蹤檔案,直到您告訴它。典型瓷器的命令,你只是告訴 Git 添加,它計算出哪些檔要拉。 然而,我要去使用管道命令而不是更常用的命令,開發人員使用 Git,可以那麼十分清楚我想要的每一步。請注意我輸入的檔路徑是區分大小寫:

git update-index --add src\EntityFramework\DbContext.cs

作為回應,在提示符狀態將更改。它仍然稱 + 0 ~ 1-0,但是該字體是現在綠的不是紅色,指示這索引的狀態。Git 現在跟蹤 0 的新物件,1 修改物件和 0 已刪除的物件,是準備被提交。

Git 索引檔和物件資料夾呢?

改變了.git 目錄中的索引檔的時間戳記。該檔現在有一種標記法表示的 DbCoNtext.cs 類的目的檔已更改。這是狀態如何知道一個修改後的檔被跟蹤。為你Entity Framework的程式師,這聽起來很熟悉?指數就像 EF DbCoNtext,跟蹤您的實體的更改 !DbCoNtext 知道當一個物件實例已添加或修改或刪除。索引檔是以這種方式類似。

但現在你可以看到該物件,太。流覽.git 反對,你會看到一個新的資料夾。如果你編輯Visual Studio中,您可能看到更多,例如,如果專案檔案進行了更改。但美中不足的是在 Notepad + +,還有只是一個新的資料夾,命名為 ae。在資料夾中是一個檔的名稱是一個雜湊,如中所示圖 5

Git 在其物件資料夾被跟蹤的物件
圖 5 Git 在其物件資料夾被跟蹤的物件

此物件是我的資料庫的一部分,和重寫表示緩存在包檔中的 DbCoNtext.cs 檔的物件。該新目的檔包含 DbCoNtext.cs,包括我的變化的內容的雜湊。

我不能看我自己,但是 Git 可以。Git,以顯示其全部內容與貓檔命令會問

git cat-file ­-p ­aeb6db24b9de85b7b7cb833379387f1754caa146

-P 參數要求美化一下的清單的文本。它後面是要列出,這是資料夾名稱 (ae) 和檔案名稱的組合的物件的名稱。Git 有表示物件名稱的快捷方式。

更有趣的視圖是一個突出的變化。我可以問 Git 來給我看看有什麼變化這一分支 (記得它的名字是"dev") 與:

git diff dev

所示的回應,我已經添加行號為清楚起見, 圖 6

回應 git diff 命令
圖 6 回應 git diff 命令

此文本的格式設置使用彩色的字體,可以很容易地分辨出不同的資訊。注意到第 8 行,是一個破折號 (這是紅色),指示我刪除了一個空行。第 9 行開始帶有加號,指示一個新行,並顯示在一個綠色的字體。如果向索引中添加更多的物件 — — 修改的或新的檔 — — 他們會在此處列出,以及。

即使索引檔是二進位的我還可以流覽它。Git ls 檔命令是便於列出所有索引檔中的存儲庫物件所表示的檔。不幸的是,ls 檔列出緩存的索引和得來挖通過它尋找我感興趣的檔在我的解決方案中,顯示每個檔的工作目錄的組合。還有另一個 git 命令,grep,用於篩選。你可以結合最小二乘-檔篩選檔。我會添加 grep (這是區分大小寫),也提出要顯示物件名稱通過使用其-s (階段) 參數的最小二乘檔:

git ls-files -s |grep DbContext.cs

包括階段參數強制要包含檔案模式指示器 (100664 意味著它是一個非可執行檔組可寫檔) 和與它相關聯的物件的雜湊檔案名的輸出:

100644 aeb6db24b9de85b7b7cb833379387f1754caa146 0
src/EntityFramework/DbContext.cs

還有更多對 ls-檔,但這是什麼我很感興趣那一刻 — — 事實上可以看到的如何 Git 將該物件的檔案對應到我的工作目錄的 DbCoNtext.cs 檔。

到 Git 資料庫犯下做什麼?

接下來,讓我們看看有點影響的推重物從上演,對所犯。記住此提交發生僅在您的電腦上。沒有獲取直接致力於在伺服器上的原始存儲庫。Git commit 命令需要您添加注釋使用-m 參數。請記住你犯了所有上演的變化。我已經只是一個在這裡:

git commit -m "Edited DbContext.cs"

Git 通過告訴我新生成的 Git 資料庫物件的名稱 (2291 c 49) 包含提交資訊並承諾做出回應。插入注釋是在檔中發生的事情 — — 添加了某些東西:

[dev 2291c49] Edited DbContext.cs
  1 file changed, 1 insertion(+)
  D:\User Documents\github\ 
    entityframework [dev]>

公告提示是乾淨的。現在的身分,是反映以來最後的承諾,沒什麼發生的一切。我又回到一個乾淨的石板。

我在提交回應資料庫中發生了什麼?我可以告訴索引檔沒有更新,因為它的時間戳記並沒有改變。

但是在物件目錄中,每個都包含它自己的雜湊物件有四個新資料夾。我用貓檔在那些檔中。第一個是清單,類似于 ls-檔的所有檔和資料夾中的 src\EntityFramework 資料夾中,以及它們的物件名。第二個是 src 資料夾中的所有物件的清單 — — 那就是,子資料夾清單。順便說一句,這些"樹",不"資料夾",在 git 中-說話。第三個物件包含所有檔和根 EntityFramework 資料夾中的資料夾的清單。最後的物件包含將需同步到伺服器的資料 — — 我提交和作者的身份 (我的電子郵件地址),和一個物件的"樹",另一個用於"父親"。有趣的是,這個最終的目標是在對提交的回應傳遞的同一物件。它在一個資料夾命名為 22,其檔案名開始與 91 c 49。

所有這些物件將用於推到伺服器存儲庫,在時機成熟時。

我有林 Git 呢?

在某種程度上,我已經採取擁有權的 Git 的探索低一級的東西。我喜歡探索原因和效果挖管道。我肯定丟了 Git 的魔法,我恐懼和玩弄它,這種方式也偶然給了我的命令語言理解和低一級使用 Git 的美。並且很可能大部分時間我嘗試過在 Windows PowerShell,太。

我有朋友是 Git 狂熱分子 — — 喜歡 Cori 德魯和我一起在 Skype 上跳時得到了迷惑不解所看到的次數 — — 以及更多人使用 Git,就好像它是他們呼吸的空氣。他們試圖讓我看看 Git 是如何工作的但我最初放棄了它。這項工作肯定授權我瞭解更多,並從中受益,並看看還有多少是學會。但僅自己迷戀資料並與敲打東西,看看他們是怎樣的反應,把我送到這一點。並為此我感謝Alan皮博迪鼓舞人心的建議。

更新:一周後最初完成了寫這篇文章,我發現我自己在兩個單獨的獨奏專案上使用 Git 分支和合併像幾乎親 !我自己的暴跌是巨大的成功,我希望你會一樣好。


Julie Lerman 是 Microsoft MVP,.NET 的導師和顧問,住在佛蒙特州的山。你可以找到她提出關於資料訪問和其他.NET 主題使用者組和世界各地的會議。她的博客 thedatafarm.com/blog ,是作者的"程式設計Entity Framework"(2010 年),以及代碼第一版 (2011 年) 和 DbCoNtext 版 (2012 年),所有從 O'Reilly 媒體。跟著她在 Twitter 上 twitter.com/julielerman ,看看她的 Pluralsight 課程 juliel.me PS 的-視頻

衷心感謝以下技術專家對本文的審閱:Cori 德魯 (coridrew@gmail.com) 和Alan皮博迪 (gapeabody@gmail.com)