2014-10-27 70 views
0

我試圖在git repo中移動一個子目錄,成爲一個新的存儲庫(保留現有的歷史記錄)。git filter-branch --subdirectory-filter失敗,出現「文件編號不正確 - 無法提交」

以下是關於這方面的各種建議,我克隆了現有的repo,刪除了遠程,現在想使用git filter-branch命令從除新目錄外的新repo中刪除所有內容。但是當我運行該命令時,出現錯誤。

$ git filter-branch --subdirectory-filter myDirectory -- --all 
C:\Program Files (x86)\Git/libexec/git-core\git-filter-branch: line 269: /libexe 
c/git-core/git: Bad file number 
Could not get the commits 

我在Windows上使用git-bash。

縱觀源git的過濾分支,這個問題似乎是試圖運行此命令時:

git rev-list --reverse --topo-order --default HEAD \ 
    --parents --simplify-merges $rev_args "[email protected]" > ../revs || 
    die "Could not get the commits" 

我可以毫無問題運行此命令自己 - 這取決於我代替了$ rev_args值。當我通過單提交時,一切都很好。但在腳本,它來自這裏:

rev_args=$(git rev-parse --revs-only "[email protected]") 

如果我運行命令,我回來有幾千提交ID的字符串。

所以我懷疑問題只是腳本試圖運行的命令對於shell來說太長了,導致我看到了神祕的錯誤消息。

那個分析聽起來是否正確?如果是這樣,我該怎麼辦呢?

我發現了一個解決方法,我會在下面發帖,但它看起來很哈克,我希望有人知道更好的方法。

回答

0

我發現git的過濾分支我的電腦上(這是在/的libexec/git的核心/ git的過濾分支對我來說,使用Windows的git-bash)的

註釋掉線287-9 (git rev-list .... || die "Could not get commits"

替換此:

rm ../revs 
for rev in $rev_args 
do 
    git rev-list --reverse --topo-order --default HEAD \ 
    --parents --simplify-merges $rev "[email protected]" >> ../revs 
done 

然後,我可以再重新運行我git filter-branch --subdirectory-filter myDirectory -- --all命令和一切都很好。

所以,這似乎是一個非常可怕的黑客攻擊。

  • 有沒有更好的方法?
  • 如果不是,您能否提出對此方法的改進?

謝謝!