2014-11-24 83 views
4

我們的開發環境使用多個存儲庫作爲整個構建系統的一部分。構建會根據您已檢出的存儲庫進行動態調整:如果不需要構建特定組件,則不要克隆它。將Git工作目錄轉換爲裸露的存儲庫?

然而,一旦你克隆一個組成部分,從構建刪除它是有問題的:

  • 您可以刪除的文件在工作目錄,但git status會顯示未提交的修改
  • 你可以刪除的存儲庫中重新克隆的代價,當你再次需要它
  • 您可以將資源庫,但你多回購工具可能「有益」再克隆

有沒有更好的方法來刪除工作目錄的文件?類似於hg co nullp4 sync ...#none

回答

2

發現similarquestions這並不太做我想做的之後,this article提供了答案:創建一個空的分支。

git checkout --orphan empty 
git rm -rf . 
git commit --allow-empty -m "An empty working directory" 

當然,確保你已經將任何重要的文件提交給你的回購首先。我稱這個分支爲empty,但您可以通過checkout命令爲其指定任何名稱。當你需要「去除」的工作目錄,提交您的更改,然後運行

git checkout master 

git checkout empty 

一旦成立,你可以切換到任何分支,讓您的文件備份

這將刪除所有跟蹤的文件。如果您還需要刪除未跟蹤文件和目錄,跟進有:

git clean -fdx 
1

可以使用--assume-unchanged功能:

git ls-files big-unused-component | xargs git update-index --assume-unchanged 

然後,你可以刪除你的文件:

rm -rf big-unused-component 

第一個命令列出big-unused-component目錄中的所有跟蹤文件,然後update-index --assume-unchanged在Gi中設置「假定此文件未更改」位t指數。然後,當你刪除整個目錄時,Git不會考慮這個更改。

要取消上一個命令的效果,請使用--no-assume-unchanged重複此操作。 git ls-files -v命令可以以這種方式顯示哪些文件已被忽略。

+1

這比git checkout empty要記住的要難得多。 – Syeberman 2014-11-24 21:22:53

+0

@Syeberman:恐怕我沒有看到如何創建一個空分支來解決你的問題。不會創建分支從存儲庫中刪除* all *文件? – 2014-11-24 21:56:15

+0

其實,這正是*我想要做的。 Mercurial有'hg co null'和Perforce'p4 sync ...#none'。我需要一種方法來刪除跟蹤的文件,同時仍然保留.git目錄中的所有歷史記錄。 – Syeberman 2014-11-25 23:21:58

0

git clean可以與各種參數一起使用,以刪除未簽入和提交的項目,並且聽起來像比上面提到的任何更好的選項。創建一個新的分支看起來完全違背了直覺,就像提交假的更改一樣,只需要單獨恢復即可。

對於很多我自己的CI構建腳本我使用這樣的事情,以確保建設面積爲100%純淨的什麼混帳有它:git clean -f -x -d

然而在進一步閱讀的混亂性質的問題變得更加明顯。這聽起來像是你在一個公共文件夾中有多個獨立的存儲庫,你的「構建」過程分別將它們用於各種事情。

我能想出兩個明顯的方式來解決這個問題:
1.子樹合併:創建一個回購/支,其唯一目的是你子樹合併其他回購所需的版本在了一起,讓你有一個可重複的版本
2.使用符號鏈接到您的'build'目錄中的倉庫,這樣你就可以吹掉符號鏈接回購倉庫,你不想參與給定的構建,而不會丟棄回購的存在只是以後再recloned 。

+0

這將刪除未跟蹤的文件和目錄,是的。我需要的是一種刪除*追蹤*文件的方法,但只是暫時的。 – Syeberman 2014-11-24 21:21:39

+0

已更新。除去刪除跟蹤文件意味着你使用git錯誤。也許與其詢問如何實施一些涉及許多不良做法的奇怪計劃,您可以直接提出有關您試圖達成的目標的問題 – UpAndAdam 2014-11-24 21:26:06

+0

我應該澄清我上面的陳述;刪除跟蹤文件本身並沒有錯。這當然是爲什麼git rm存在:-p刪除它們不是爲了從GIT中實際刪除它們,而是僅僅爲了「build」,我想說的是'錯誤'。 – UpAndAdam 2014-11-24 21:33:00

相關問題