2010-04-21 87 views
9

我試圖設置一個git倉庫的darcs鏡像。我有一些工作正常,但有一個重要的問題:如果我將一大堆提交到git倉庫,這些提交合併到一個darcs補丁集中。我真的想確保每個git commit都被設置爲一個darcs補丁集。我敢打賭,這可以通過做一些git fetch然後審問遠程分支的本地副本,但我的git fu不能勝任這項工作。如何從遠程git存儲庫一次提交一個提交?

這是我現在使用的(KSH)代碼,或多或少:

git pull -v # pulls all the commits from remote --- bad! 

# gets information about only the last commit pulled -- bad! 
author="$(git log HEAD^..HEAD --pretty=format:"%an <%ae>")" 
logfile=$(mktemp) 
git log HEAD^..HEAD --pretty=format:"%s%n%b%n" > $logfile 

# add all new files to darcs and record a patchset. this part is OK 
darcs add -q --umask=0002 -r . 
darcs record -a -A "$author" --logfile="$logfile" 
darcs push -a 
rm -f $logfile 

我的想法是

  1. 嘗試git fetch獲得遠程分支的本地副本(不知道到底需要什麼參數)
  2. 以某種方式詢問本地副本以獲取自上次鏡像操作以來每次提交的哈希值(我不知道該如何操作)
  3. 通過所有的哈希值,拉動只是承諾並記錄相關的補丁集循環(我敢肯定,我知道如何做到這一點,如果我得到我的手哈希)

我歡迎任何幫助去肉在以上的情況或關於的建議我應該嘗試。

想法?

+0

正如一個提醒,有幾個新的答案,你還沒有評論。 (顯然其中一個我認爲其實很好地回答你的問題;)) – 2011-05-16 09:58:24

回答

0

git remote update # fetch all remotes I like it better than just fetch

git log origin/master # can be any remote/branch

git cherry-pick origin/master # example remote/branch you can also specify a sha1

摘櫻桃將按默認上貼片。

第三部分我認爲你必須寫一個腳本來爲你做。還有其他方法可以獲得哈希值和大量日誌選項。實際上,可能有一個挑選櫻桃的勾或者可能只是提交後運行darcs代碼。檢查git鉤子。

事實上,在該筆記中,在rebase中應用的每個補丁可能會調用git commit hook,因此您可能可以編寫該代碼然後執行git pull --rebase並將該代碼釘在每個應用上...

+0

引用githooks的+1。 – jweyrich 2010-04-21 05:48:29

+1

我已經在網上研究了'git cherry-pick'的信息,這不是我想要的!它創建一個新的,獨特的提交!我會深入挖掘。 – 2010-04-22 22:57:22

0

使用它從一個分支檢索哈希:

git log --pretty=format:"%h" HEAD..origin/master 

然後使用git cherry-pick -n <hash>申請每一個。

@xenoterracide引用的另一種選擇是使用githooks。

+4

我在網上研究了'git cherry-pick'的信息,這不是我想要的!它創建一個新的,獨特的提交!我會深入挖掘。 – 2010-04-22 22:57:47

2

您是否嘗試過尋找移動版本控制系統之間的變更現有的一些解決方案,如Tailor,它說,它包含了Git和支持的darcs? (有該網頁上的類似系統的建議爲好。)

否則,如果你想用你的建議的方法,你可以使用每個git checkoutHEAD後承諾origin/master結帳,在「分離的頭」提交模式。例如,修改你給的例子(在Bourne shell中,我很害怕,因爲我不使用KSH):

# Update all remote-tracking branches from origin 
git fetch origin 

for c in `git log --pretty=format:"%h" HEAD..origin/master` 
do 
    git checkout $c 
    author=$(git log -1 --pretty=format:"%an <%ae>") 
    logfile=$(mktemp) 
    git log -1 --pretty=format:"%s%n%n%b%n" > $logfile 

    darcs add -q --umask=0002 -r . 
    darcs record -a -A "$author" --logfile="$logfile" 
    darcs push -a 
    rm -f $logfile   
done 

# Now go back to master, and merge to keep your master branch up to date: 
git checkout master 
git merge origin/master 

注意,這將線性的歷史從混帳,這將不親自做我想做的事。 :)我認爲最好爲此使用現有的工具,但上述方法可以起作用。

1

你可以做這樣的事情:

#!/bin/bash 
git fetch 
count=$(git log --pretty=oneline | wc -l) 
git merge origin/master 
git reset --hard HEAD~$((count-1)) 

我創建了這個腳本庫,並嘗試了一下。以下是前,後合併:

enter image description here

enter image description here

現在,我沒有遠程倉庫,所以我僞造了git的提取和遠程分支與本地(名爲卡勒),但你明白了。只需進行完整的合併,然後備份HEAD指針,直到從原點/主機到達第一個提交。

相關問題