2010-08-20 47 views
2

This question把我的一部分,但我仍然失去了一些東西。如何分離一個Git倉庫乾淨?

我有一個單用戶存儲庫(所以在重寫歷史記錄與推/拉時沒有問題),我已經開發了產品代碼並支持代碼和文檔。

經過一年多的工作,我終於看到了光明,並希望將我的回購分爲兩部分。這是我試過的:

  1. 在項目根目錄下創建兩個新目錄;讓我們稱他們爲項目/代碼和/工程/支持/
  2. 混帳MV所有代碼的東西到Code/
  3. 混帳MV所有支持的東西到支持/
  4. 複製和修改的.gitignore適當
  5. 承諾一切

現在,當我運行了我認爲正確的命令:

git filter-branch -d /cygdrive/z/temp/ --subdirectory-filter Code/ -- --all 

我只是得到一種超然分支一個單一的提交,我的原始分支仍然在那裏(如original/refs/head/brent),而其他所有分支都是原樣。

我真正需要的是重寫歷史,就好像代碼/目錄是「永遠存在」,而Support/stuff不是,反之亦然。

我是一個相對的Git小白,所以我敢肯定,我已經錯過了一些重要的概念 - 請填寫我


OK,我做到了這一點,而且它似乎。做我所需要的,非常感謝。我有一對夫婦補充問題:

  1. 我加了-r以允許移除完整的目錄。它是否正確?我實際使用的命令是:

    git的過濾分支--index過濾器\
    'git的RM -r --cached - 忽略的不匹配' \
    - - 所有

  2. 的倉庫現在的提交次數大約是我預期的兩倍。這些在gitk中顯示爲與名稱爲「original/refs/heads/TestSys」的東西鏈接在一起。

我假設這些是原始提交樹;我如何擺脫它們?他們不會出現在fsck中,修剪和gc - agressive都不能擺脫他們。


嗯,哦,只是讀了精細的手冊;去嘗試git克隆來修剪cruft。


好的,現在我已經完成了克隆,並且存儲庫已縮小到原始大小。克隆似乎只是複製的分支信息當前(源回購)頭,我不得不手動設置其他分支機構與此:

for n in `git branch -r|grep -v 'HEAD'` ; do git branch ${n/origin?/} $n ; done 

有沒有一種簡單的方法,在克隆的時間來做到這一點?

加上這個:我不希望看起來忘恩負義,但現在有「空」提交,它只用於觸摸現在已經消失的文件。

有沒有簡單的方法來消除這些?

非常感謝您的幫助和耐心。

回答

3

我想將文件移動到子目錄是問題 - git在移動之前不會跟着它們。我建議克隆兩個新舊版本庫,並在其中運行以下每個版本:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <list of files that shouldnt be here>' -- --all