簡體   English   中英

全局刪除裸Git存儲庫中的文件

[英]Remove files from a bare Git Repository Globally

我想刪除一些有人推入我們的git存儲庫的大文件,所以其他人可以從repo中取出而不下載它們。

我已經嘗試忽略這些文件,並且還從沒有運氣推送它們的主機中刪除/提交/推送它們。

我可以訪問服務器和裸倉庫

謝謝!

git filter-branch是你的答案。

從裸存儲庫中,您有多種選擇。

1)您希望從每次提交中刪除一個或多個文件。

$ git filter-branch --index-filter \
               'git rm --cached --ignore-unmatch junk/bigfile' -- --all

要么

$ git filter-branch --index-filter \
               'git rm --cached --ignore-unmatch -r junk/' -- --all

2)您想要找到一個文件,無論其路徑如何,並刪除其存在的所有歷史記錄。

$ git filter-branch --index-filter \
      'mv $GIT_INDEX_FILE /tmp/index;
       GIT_INDEX_FILE=/tmp/index git ls-files -s|
       grep -v FILENAME|git update-index --index-info' -- --all

3)您想要查找特定的已提交文件,並僅刪除該文件。 例如,如果提交一個大型二進制文件,然后用較小的文件替換該文件,則需要找到包含原始大文件的blob,然后將其刪除。

$ git ls-tree -r <commit> | grep SOMEFILE
100644 blob 4cbedad5b4ab88f700bf27ae5a32bdb3627fa632    SOMEFILE
$ git filter-branch --index-filter \
      'mv $GIT_INDEX_FILE /tmp/index;
       GIT_INDEX_FILE=/tmp/index git ls-files -s|
       grep -v 4cbedad5b4ab88f700bf27ae5a32bdb3627fa632|
       git update-index --index-info'  -- --all

每次執行此操作時,當前的“refs”或分支頭組都會備份到refs / original目錄中。 您始終可以將這些復制回refs / heads以恢復存儲庫。

如果要刪除的文件導致空提交,請將“--prune-empty”選項添加到git-filter-branch命令行。 這將允許git完全放棄提交。

只要refs / original包含原始頭,git將永遠不會刪除已刪除的文件或blob。

一旦您對結果完全滿意,存儲庫本身就可以縮小

$ rm -rf refs/original
$ git fsck
$ git prune
$ git gc
$ git repack -a

你完成了。

警告 :git-filter-branch將重寫每次提交。 確保未更改未提交/未按下的工作。 在此之前必須承諾並推動每個人。

完成后,每個人都應該執行以下$ git fetch --all $ git reset --hard @ {upstream}

您必須使用git filter-branch或類似技術重寫歷史記錄。 請參閱此示例以刪除github幫助中的文件Rakefile

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch Rakefile' \
  --prune-empty -- --all

您應該知道,已經克隆了您的存儲庫的每個人都需要將其分支硬盤重置為遠程控制台上的分支,否則它們將重新引入這些文件。

如果要刪除的文件是自己提交的,則可以使用rebase命令簡單地消除提交。

1)簽出工作副本

$ git clone -s bare_repo.git
$ cd bare_repo

2)使用git-log查找提交

$ git log
384b1a3306c1247559563f855e2adf5ced80678b good commit
8abb0e7cf306ceb209cb5c4aa3b422b9460fdb64 bad commit

3)使用git rebase重寫歷史記錄,省略該提交

$ git rebase -i 8abb0e7cf306ceb209cb5c4aa3b422b9460fdb64^   <--- note the ^**

4)糟糕的提交應該是頂線。 刪除該行,保存並退出。 5)git-log應該顯示你的錯誤提交的歷史記錄。 5)推回更改。 使用-f標志強制更新

$ git push -f origin master

6)您現在可以刪除工作樹

還有BFG Repo-Cleaner ,它比git-filter-branch快得多。 但是,它不會刪除分支中引用的文件。 請教Dave回答刪除它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM