2011-06-13 89 views
2

類似的問題How to cherry-pick multiple commits假定提交是連續的。提取部分git倉庫的git歷史記錄以創建git子模塊 - cherry-pick?

我有一個模塊,我作爲tarball下載。我將它包含在我的主項目的git repo中,並對其進行了更改。這些更改與主項目的其他提交散佈在一起。

我已經意識到我的方式的錯誤,並希望用git子模塊替換模塊。我可以添加目前的狀態,但我想保留我的git歷史記錄。

如何將每個單獨的提交移動到新的回購中?


我想我可以用櫻桃挑選做到這一點,但這很耗時。下面是我有:

安裝我的新回購與主體工程同時爲遠程(這樣我就可以櫻桃挑選):

cd ~/snippets 
git remote add main ~/.vim/ 
git fetch main 

我可以看到在主項目相關的提交與git log ~/.vim/snippets

我可以做一個腳本,櫻桃挑

cd ~/.vim/snippets 
git log --oneline --reverse --format="format:git cherry-pick %h #%s" . 

但是,如果我運行該腳本,有合併衝突。解決合併和提交後,我需要從我的櫻桃挑選腳本中刪除成功的位並重新運行它。我想自動執行此操作,例如git rebase。

回答

1

您可能會發現git filter-branch是有益的 - 如果你使用--tree-filter四處移動文件和--commit-filter去除那些對你的分支沒有任何影響提交,那麼你應該能夠只包含變化的分支落得來自您的子項目。

如果您現在沒有時間,可以使用我的其他答案作爲臨時措施:)。

+0

好的。我克隆了我的主repo,並使用filter-branch清理不相關的文件。我猜如果我想將我的更改應用於現有的回購,我可以將其添加爲遠程並在頂部重新命名。我使用了'--prune-empty'而不是'--commit-filter',並且做了一些重建來移除舊的空的合併提交。大! – idbrii 2011-06-14 00:01:46

+0

雖然我沒有使用它,但我發現使用filter-branch的[詳細帳戶](http://kevin.deldycke.com/2011/02/moving-git-subtree-repository/)。 – idbrii 2011-06-14 00:04:32

0

如果您只是需要歷史記錄,但如果有額外的數據,則不必太在意,您可以創建幾個分支,一個用於主代碼,另一個用於片段。將代碼片段移至其分支的頂層,刪除其餘文件。您應該發現重命名跟蹤允許您查看文件的歷史記錄,但您的歷史中顯然會有額外的文件和提交。然後,您可以使用此分支(可能克隆到單獨的存儲庫)作爲您的子模塊。

然後,在未來,當你有更多的時間,你可以使用我的其他答案來清理你的歷史:)。

0

This question顯示了一個更簡單的方法:

git filter-branch --subdirectory-filter repo/subdirectory -- --all 

git help filter-branch

--subdirectory-filter <directory>

只看這倒是給定的子目錄中的歷史。 結果將包含該目錄(僅限該目錄)作爲其 項目根目錄。意味着「重新映射到祖先」一節。