<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant-TW">
	<id>https://jiva.dila.edu.tw/index.php?action=history&amp;feed=atom&amp;title=Pro_Git_9.7_%E7%B6%AD%E8%AD%B7%E5%8F%8A%E8%B3%87%E6%96%99%E5%BE%A9%E5%8E%9F</id>
	<title>Pro Git 9.7 維護及資料復原 - 修訂歷史</title>
	<link rel="self" type="application/atom+xml" href="https://jiva.dila.edu.tw/index.php?action=history&amp;feed=atom&amp;title=Pro_Git_9.7_%E7%B6%AD%E8%AD%B7%E5%8F%8A%E8%B3%87%E6%96%99%E5%BE%A9%E5%8E%9F"/>
	<link rel="alternate" type="text/html" href="https://jiva.dila.edu.tw/index.php?title=Pro_Git_9.7_%E7%B6%AD%E8%AD%B7%E5%8F%8A%E8%B3%87%E6%96%99%E5%BE%A9%E5%8E%9F&amp;action=history"/>
	<updated>2026-05-05T18:15:24Z</updated>
	<subtitle>本 Wiki 上此頁面的修訂歷史</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://jiva.dila.edu.tw/index.php?title=Pro_Git_9.7_%E7%B6%AD%E8%AD%B7%E5%8F%8A%E8%B3%87%E6%96%99%E5%BE%A9%E5%8E%9F&amp;diff=595&amp;oldid=prev</id>
		<title>imported&gt;Ray：​新頁面: 偶爾，你可能需要進行一些清理工作 ── 如減小一個倉庫的大小，清理導入的倉庫，或是恢復丟失的資料。本節將描述這類使用場景。  =維...</title>
		<link rel="alternate" type="text/html" href="https://jiva.dila.edu.tw/index.php?title=Pro_Git_9.7_%E7%B6%AD%E8%AD%B7%E5%8F%8A%E8%B3%87%E6%96%99%E5%BE%A9%E5%8E%9F&amp;diff=595&amp;oldid=prev"/>
		<updated>2011-06-27T07:28:19Z</updated>

		<summary type="html">&lt;p&gt;新頁面: 偶爾，你可能需要進行一些清理工作 ── 如減小一個倉庫的大小，清理導入的倉庫，或是恢復丟失的資料。本節將描述這類使用場景。  =維...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新頁面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;偶爾，你可能需要進行一些清理工作 ── 如減小一個倉庫的大小，清理導入的倉庫，或是恢復丟失的資料。本節將描述這類使用場景。&lt;br /&gt;
&lt;br /&gt;
=維護=&lt;br /&gt;
&lt;br /&gt;
Git 會不定時地自動執行稱為「auto gc」的命令。大部分情況下該命令什麼都不處理。不過要是存在太多鬆散物件 (loose object, 不在 packfile 中的物件) 或 packfile，Git 會執行 git gc 命令。gc 指垃圾收集 (garbage collect)，此命令會做很多工作：收集所有鬆散物件並將它們存入 packfile，合併這些 packfile 進一個大的 packfile，然後將不被任何 commit 引用並且已存在一段時間 (數月) 的物件刪除。&lt;br /&gt;
&lt;br /&gt;
可以手動執行 auto gc 命令：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git gc --auto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
再次強調，這個命令一般什麼都不幹。如果有 7,000 個左右的鬆散對象或是 50 個以上的 packfile，Git 才會真正調用 gc 命令。可能通過修改配置中的 gc.auto 和 gc.autopacklimit 來調整這兩個設定值。&lt;br /&gt;
&lt;br /&gt;
gc 還會將所有引用 (references) 併入一個單獨檔。假設倉庫中包含以下分支和標籤：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ find .git/refs -type f&lt;br /&gt;
.git/refs/heads/experiment&lt;br /&gt;
.git/refs/heads/master&lt;br /&gt;
.git/refs/tags/v1.0&lt;br /&gt;
.git/refs/tags/v1.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
這時如果執行 git gc, refs 下的所有檔都會消失。Git 會將這些檔挪到 .git/packed-refs 檔中去以提高效率，該檔是這個樣子的：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ cat .git/packed-refs&lt;br /&gt;
# pack-refs with: peeled&lt;br /&gt;
cac0cab538b970a37ea1e769cbbde608743bc96d refs/heads/experiment&lt;br /&gt;
ab1afef80fac8e34258ff41fc1b867c702daa24b refs/heads/master&lt;br /&gt;
cac0cab538b970a37ea1e769cbbde608743bc96d refs/tags/v1.0&lt;br /&gt;
9585191f37f7b0fb9444f35a9bf50de191beadc2 refs/tags/v1.1&lt;br /&gt;
^1a410efbd13591db07496601ebc7a059dd55cfe9&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
當更新一個引用時，Git 不會修改這個檔，而是在 refs/heads 下寫入一個新檔。當查找一個引用的 SHA 時，Git 首先在 refs 目錄下查找，如果未找到則到 packed-refs 檔中去查找。因此如果在 refs 目錄下找不到一個引用，該引用可能存到 packed-refs 檔中去了。&lt;br /&gt;
&lt;br /&gt;
請留意檔最後以 ^ 開頭的那一行。這表示該行上一行的那個標籤是一個 annotated 標籤，而該行正是那個標籤所指向的 commit 。&lt;br /&gt;
&lt;br /&gt;
=資料恢復=&lt;br /&gt;
&lt;br /&gt;
在使用 Git 的過程中，有時會不小心丟失 commit 資訊。這一般出現在以下情況下：強制刪除了一個分支而後又想重新使用這個分支，hard-reset 了一個分支從而丟棄了分支的部分 commit。如果這真的發生了，有什麼辦法把丟失的 commit 找回來呢？&lt;br /&gt;
&lt;br /&gt;
下面的示例演示了對 test 倉庫主分支進行 hard-reset 到一個老版本的 commit 的操作，然後恢復丟失的 commit 。首先查看一下當前的倉庫狀態：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git log --pretty=oneline&lt;br /&gt;
ab1afef80fac8e34258ff41fc1b867c702daa24b modified repo a bit&lt;br /&gt;
484a59275031909e19aadb7c92262719cfcdf19a added repo.rb&lt;br /&gt;
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit&lt;br /&gt;
cac0cab538b970a37ea1e769cbbde608743bc96d second commit&lt;br /&gt;
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接著將 master 分支移回至中間的一個 commit：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git reset --hard 1a410efbd13591db07496601ebc7a059dd55cfe9&lt;br /&gt;
HEAD is now at 1a410ef third commit&lt;br /&gt;
$ git log --pretty=oneline&lt;br /&gt;
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit&lt;br /&gt;
cac0cab538b970a37ea1e769cbbde608743bc96d second commit&lt;br /&gt;
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
這樣就丟棄了最新的兩個 commit ── 包含這兩個 commit 的分支不存在了。現在要做的是找出最新的那個 commit 的 SHA，然後添加一個指向它的分支。關鍵在於找出最新的 commit 的 SHA ── 你不大可能記住了這個 SHA，是吧？&lt;br /&gt;
&lt;br /&gt;
通常最快捷的辦法是使用 git reflog 工具。當你 (在一個倉庫下) 工作時，Git 會在你每次修改了 HEAD 時悄悄地將改動記錄下來。當你提交或修改分支時，reflog 就會更新。git update-ref 命令也可以更新 reflog，這是在本章前面的 “Git References” 部分我們使用該命令而不是手工將 SHA 值寫入 ref 文件的理由。任何時間執行 git reflog 命令可以查看當前的狀態：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git reflog&lt;br /&gt;
1a410ef HEAD@{0}: 1a410efbd13591db07496601ebc7a059dd55cfe9: updating HEAD&lt;br /&gt;
ab1afef HEAD@{1}: ab1afef80fac8e34258ff41fc1b867c702daa24b: updating HEAD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可以看到我們簽出的兩個 commit ，但沒有更多的相關資訊。運行 git log -g 會輸出 reflog 的正常日誌，從而顯示更多有用資訊：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git log -g&lt;br /&gt;
commit 1a410efbd13591db07496601ebc7a059dd55cfe9&lt;br /&gt;
Reflog: HEAD@{0} (Scott Chacon &amp;lt;schacon@gmail.com&amp;gt;)&lt;br /&gt;
Reflog message: updating HEAD&lt;br /&gt;
Author: Scott Chacon &amp;lt;schacon@gmail.com&amp;gt;&lt;br /&gt;
Date:   Fri May 22 18:22:37 2009 -0700&lt;br /&gt;
&lt;br /&gt;
    third commit&lt;br /&gt;
&lt;br /&gt;
commit ab1afef80fac8e34258ff41fc1b867c702daa24b&lt;br /&gt;
Reflog: HEAD@{1} (Scott Chacon &amp;lt;schacon@gmail.com&amp;gt;)&lt;br /&gt;
Reflog message: updating HEAD&lt;br /&gt;
Author: Scott Chacon &amp;lt;schacon@gmail.com&amp;gt;&lt;br /&gt;
Date:   Fri May 22 18:15:24 2009 -0700&lt;br /&gt;
&lt;br /&gt;
     modified repo a bit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
看起來弄丟了的 commit 是底下那個，這樣在那個 commit 上創建一個新分支就能把它恢復過來。比方說，可以在那個 commit (ab1afef) 上創建一個名為 recover-branch 的分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git branch recover-branch ab1afef&lt;br /&gt;
$ git log --pretty=oneline recover-branch&lt;br /&gt;
ab1afef80fac8e34258ff41fc1b867c702daa24b modified repo a bit&lt;br /&gt;
484a59275031909e19aadb7c92262719cfcdf19a added repo.rb&lt;br /&gt;
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit&lt;br /&gt;
cac0cab538b970a37ea1e769cbbde608743bc96d second commit&lt;br /&gt;
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
酷！這樣有了一個跟原來 master 一樣的 recover-branch 分支，最新的兩個 commit 又找回來了。&lt;br /&gt;
&lt;br /&gt;
接著，假設引起 commit 丟失的原因並沒有記錄在 reflog 中 ── 可以通過刪除 recover-branch 和 reflog 來類比這種情況。這樣最新的兩個 commit 不會被任何東西引用到：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git branch –D recover-branch&lt;br /&gt;
$ rm -Rf .git/logs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因為 reflog 資料是保存在 .git/logs/ 目錄下的，這樣就沒有 reflog 了。現在要怎樣恢復 commit 呢？辦法之一是使用 git fsck 工具，該工具會檢查倉庫的資料完整性。如果指定 --ful 選項，該命令顯示所有未被其他物件引用 (指向) 的所有物件：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git fsck --full&lt;br /&gt;
dangling blob d670460b4b4aece5915caf5c68d12f560a9fe3e4&lt;br /&gt;
dangling commit ab1afef80fac8e34258ff41fc1b867c702daa24b&lt;br /&gt;
dangling tree aea790b9a58f6cf6f2804eeac9f0abbe9631e4c9&lt;br /&gt;
dangling blob 7108f7ecb345ee9d0084193f147cdad4d2998293&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
本例中，可以從 dangling commit 找到丟失了的 commit。用相同的方法就可以恢復它，即創建一個指向該 SHA 的分支。&lt;br /&gt;
&lt;br /&gt;
=移除物件=&lt;br /&gt;
&lt;br /&gt;
Git 有許多過人之處，不過有一個功能有時卻會帶來問題：git clone 會將包含每一個檔的所有歷史版本的整個專案下載下來。如果專案包含的僅僅是原始程式碼的話這並沒有什麼壞處，畢竟 Git 可以非常高效地壓縮此類資料。不過如果有人在某個時刻往專案中添加了一個非常大的檔，即便他在後來的提交中將此檔刪掉了，所有的簽出都會下載這個大檔。因為歷史記錄中引用了這個檔，它會一直存在著。&lt;br /&gt;
&lt;br /&gt;
當你將 Subversion 或 Perforce 倉庫轉換導入至 Git 時這會成為一個很嚴重的問題。在此類系統中，(簽出時) 不會下載整個倉庫歷史，所以這種情形不大會有不良後果。如果你從其他系統導入了一個倉庫，或是發覺一個倉庫的尺寸遠超出預計，可以用下面的方法找到並移除大 (尺寸) 物件。&lt;br /&gt;
&lt;br /&gt;
警告：此方法會破壞提交歷史。為了移除對一個大檔的引用，從最早包含該引用的 tree 物件開始之後的所有 commit 物件都會被重寫。如果在剛導入一個倉庫並在其他人在此基礎上開始工作之前這麼做，那沒有什麼問題 ── 否則你不得不通知所有協作者 (貢獻者) 去衍合你新修改的 commit 。&lt;br /&gt;
&lt;br /&gt;
為了演示這點，往 test 倉庫中加入一個大檔，然後在下次提交時將它刪除，接著找到並將這個檔從倉庫中永久刪除。首先，加一個大檔進去：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ curl http://kernel.org/pub/software/scm/git/git-1.6.3.1.tar.bz2 &amp;gt; git.tbz2&lt;br /&gt;
$ git add git.tbz2&lt;br /&gt;
$ git commit -am 'added git tarball'&lt;br /&gt;
[master 6df7640] added git tarball&lt;br /&gt;
 1 files changed, 0 insertions(+), 0 deletions(-)&lt;br /&gt;
 create mode 100644 git.tbz2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
喔，你並不想往專案中加進一個這麼大的 tar 包。最後還是去掉它：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git rm git.tbz2&lt;br /&gt;
rm 'git.tbz2'&lt;br /&gt;
$ git commit -m 'oops - removed large tarball'&lt;br /&gt;
[master da3f30d] oops - removed large tarball&lt;br /&gt;
 1 files changed, 0 insertions(+), 0 deletions(-)&lt;br /&gt;
 delete mode 100644 git.tbz2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
對倉庫進行 gc 操作，並查看佔用了空間：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git gc&lt;br /&gt;
Counting objects: 21, done.&lt;br /&gt;
Delta compression using 2 threads.&lt;br /&gt;
Compressing objects: 100% (16/16), done.&lt;br /&gt;
Writing objects: 100% (21/21), done.&lt;br /&gt;
Total 21 (delta 3), reused 15 (delta 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可以執行 count-objects 以查看使用了多少空間：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git count-objects -v&lt;br /&gt;
count: 4&lt;br /&gt;
size: 16&lt;br /&gt;
in-pack: 21&lt;br /&gt;
packs: 1&lt;br /&gt;
size-pack: 2016&lt;br /&gt;
prune-packable: 0&lt;br /&gt;
garbage: 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
size-pack 是以千位元組為單位表示的 packfiles 的大小，因此已經使用了 2MB 。而在這次提交之前僅用了 2K 左右 ── 顯然在這次提交時刪除檔並沒有真正將其從歷史記錄中刪除。每當有人複製這個倉庫去取得這個小專案時，都不得不複製所有 2MB 資料，而這僅僅因為你曾經不小心加了個大檔。讓我們來解決這個問題。&lt;br /&gt;
&lt;br /&gt;
首先要找出這個檔。在本例中，你知道是哪個文件。假設你並不知道這一點，要如何找出哪個 (些) 文件佔用了這麼多的空間？如果執行 git gc，所有物件會存入一個 packfile 檔；執行另一個底層命令 git verify-pack 以識別出大物件，對輸出的第三欄資訊即檔案大小進行排序，還可以將輸出定向到 tail 命令，因為你只關心排在最後的那幾個最大的檔：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3&lt;br /&gt;
e3f094f522629ae358806b17daf78246c27c007b blob   1486 734 4667&lt;br /&gt;
05408d195263d853f09dca71d55116663690c27c blob   12908 3478 1189&lt;br /&gt;
7a9eb2fba2b1811321254ac360970fc169ba2330 blob   2056716 2056872 5401&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最底下那個就是那個大檔：2MB 。要查看這到底是哪個檔，可以使用第 7 章中已經簡單使用過的 rev-list 命令。若給 rev-list 命令傳入 --objects 選項，它會列出所有 commit SHA 值，blob SHA 值及相應的檔路徑。可以這樣查看 blob 的檔案名：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git rev-list --objects --all | grep 7a9eb2fb&lt;br /&gt;
7a9eb2fba2b1811321254ac360970fc169ba2330 git.tbz2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
接下來要將該檔從歷史記錄的所有 tree 中移除。很容易找出哪些 commit 修改了這個檔：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git log --pretty=oneline -- git.tbz2&lt;br /&gt;
da3f30d019005479c99eb4c3406225613985a1db oops - removed large tarball&lt;br /&gt;
6df764092f3e7c8f5f94cbe08ee5cf42e92a0289 added git tarball&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
必須重寫從 6df76 開始的所有 commit 才能將檔從 Git 歷史中完全移除。這麼做需要用到第 6 章中用過的 filter-branch 命令：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git filter-branch --index-filter \&lt;br /&gt;
   'git rm --cached --ignore-unmatch git.tbz2' -- 6df7640^..&lt;br /&gt;
Rewrite 6df764092f3e7c8f5f94cbe08ee5cf42e92a0289 (1/2)rm 'git.tbz2'&lt;br /&gt;
Rewrite da3f30d019005479c99eb4c3406225613985a1db (2/2)&lt;br /&gt;
Ref 'refs/heads/master' was rewritten&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--index-filter 選項類似於第 6 章中使用的 --tree-filter 選項，但這裡不是傳入一個命令去修改磁片上簽出的檔，而是修改暫存區域或索引。不能用 rm file 命令來刪除一個特定檔，而是必須用 git rm --cached 來刪除它 ── 即從索引而不是磁片刪除它。這樣做是出於速度考慮 ── 由於 Git 在執行你的 filter 之前無需將所有版本簽出到磁片上，這個操作會快得多。也可以用 --tree-filter 來完成相同的操作。git rm 的 --ignore-unmatch 選項指定當你試圖刪除的內容並不存在時不顯示錯誤。最後，因為你清楚問題是從哪個 commit 開始的，使用 filter-branch 重寫自 6df7640 這個 commit 開始的所有歷史記錄。不這麼做的話會重寫所有歷史記錄，花費不必要的更多時間。&lt;br /&gt;
&lt;br /&gt;
現在歷史記錄中已經不包含對那個檔的引用了。不過 reflog 以及運行 filter-branch 時 Git 往 .git/refs/original 添加的一些 refs 中仍有對它的引用，因此需要將這些引用刪除並對倉庫進行 repack 操作。在進行 repack 前需要將所有對這些 commits 的引用去除：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ rm -Rf .git/refs/original&lt;br /&gt;
$ rm -Rf .git/logs/&lt;br /&gt;
$ git gc&lt;br /&gt;
Counting objects: 19, done.&lt;br /&gt;
Delta compression using 2 threads.&lt;br /&gt;
Compressing objects: 100% (14/14), done.&lt;br /&gt;
Writing objects: 100% (19/19), done.&lt;br /&gt;
Total 19 (delta 3), reused 16 (delta 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
看一下節省了多少空間。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;&lt;br /&gt;
$ git count-objects -v&lt;br /&gt;
count: 8&lt;br /&gt;
size: 2040&lt;br /&gt;
in-pack: 19&lt;br /&gt;
packs: 1&lt;br /&gt;
size-pack: 7&lt;br /&gt;
prune-packable: 0&lt;br /&gt;
garbage: 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
repack 後倉庫的大小減小到了 7K ，遠小於之前的 2MB 。從 size 值可以看出大檔物件還在鬆散物件中，其實並沒有消失，不過這沒有關係，重要的是在再進行推送或複製，這個物件不會再傳送出去。如果真的要完全把這個物件刪除，可以運行 git prune --expire 命令。&lt;/div&gt;</summary>
		<author><name>imported&gt;Ray</name></author>
	</entry>
</feed>