2013-02-01 2395 views
24

我目前正在嘗試對github倉庫的PR進行代碼風格檢查,並且我想將修補程序交付給提交者,用它們可以輕鬆修復代碼風格。爲此,我正在拉下他們的PR,運行我們的uncrustify腳本來修復任何樣式錯誤,並且想要創建一個可以輕鬆應用的.patch文件。但是,它在一些文件中一直打破。git-apply神祕失敗,我該如何解決/修復?

怎麼辦?(Git版本1.7.10.4與core.autocrlf=inputcore.filemode=false):

$ git checkout pr-branch 
$ git log -1 (shows: commit dbb8d3f) 
$ git status (nothing to commit, working directory clean) 
$ <run the code styler script, which modifies some files> 
$ git diff > ../style.patch (so the patch file lands outside the repo) 
$ git reset --hard HEAD (to simulate the situation at the submitter's end) 
$ git log -1 (shows: commit dbb8d3f) 
$ git status (nothing to commit, working directory clean, so we are where we started) 
$ git apply ../style.patch 
error: patch failed: somefile.cpp:195 
error: somefile.cpp: patch does not apply (same output using the --check option) 

這僅適用於某些文件,不是所有的人。我不知道如何解決這個問題,也就是說如何讓git告訴我它到底發生了什麼錯誤 - 當我挖掘它時,它只告訴我一個大塊頭,但這仍然非常大。

我到目前爲止已經試過(沒有成功):

  1. apply --reverseapply --whitespace=nowarn
  2. diff HEAD,而不是單獨diff
  3. 做一個虛擬提交(!提交作品沒有問題),使用format-patch ,刪除虛擬提交,應用帶有或不帶-3git-am的補丁,或者與git-apply
  4. 一起申請帶有補丁文件的lo CAL目錄,而不是一上來(抓救命稻草,在這裏)
  5. 檢查的git-DIFF的人的頁面,-apply,-format補丁,用於-am有用的東西
  6. 補丁與Linux patch命令
  7. ....

我不知道什麼可能是錯誤的差異。空白的東西只應該警告,對吧?無論如何,我不想忽視它們,因爲它是一種明顯涉及空白的樣式修復。

我該如何修復/診斷這個問題,甚至找出它準確的保存位置?如果我發佈了其中一個罪魁禍首文件的差異,會有幫助嗎?讓我感到困惑的是,這個委託沒有問題,但是從提交創建的補丁不是?

與此摔跤幾個小時我在我的知識結束後...

+5

'git的應用 - -reject'查看被拒絕的更改。 – aragaer

+0

試過已經......這隻會告訴你整個失敗的大塊(在這種情況下大約2-300行),所以沒有很多信息 – Christoph

+0

另一個猜測 - 可能會有一些文件重命名,有些可能會變成'gitignored'作爲結果。 – aragaer

回答

23

更新:

您可以使用git apply -v看到有關更詳細的信息是怎麼回事,git apply --check只驗證操作,或者git apply --index重建本地索引文件。

根據您的評論,似乎您的本地索引已損壞,因此index解決了它。

我會留下我原來的回答和評論,主要是爲了讓人們瞭解正在發生的事情,因爲我懷疑其他人會跳到我基於問題描述得出的同樣的初步結論。

------

最有可能沒有任何毛病的差異。而是看看目標git存儲庫。在您正在執行git reset --hard HEAD時,沒有什麼可以保證您在其他存儲庫上的HEAD與您的HEAD相同。

對目標回購執行git log並查看頂部的提交。它與你製作差異的那個一樣嗎?最有可能的不是。查看歷史記錄並檢查您需要的提交是否存在。如果是,那麼目標回購在你的前面,你必須回去,做git pull(或git rebase)併產生一個新的差異。如果不是,那麼目標回購就在你的後面,你需要在目標回購上執行git pull(或git rebase)以加快速度。請注意,如果您有其他人對您的「主」回購(您的機器人和目標存儲庫從中拉出的回購機構)承諾,那麼您可能不得不git pull這兩個存儲庫,以使其達到合理的最近期共同承諾。

+0

在上面描述的過程中,當前的HEAD對於差異創建和差異應用都是相同的。這是該分支的最後一次提交。我正在進行重置以消除來自不同HEAD的任何問題。所以不能這樣。 必要時更新已經自動處理,但如果在上述測試情況下應用不起作用,那麼它也將在那裏失效,因此必須先解決。 – Christoph

+0

從描述中可以看出,兩個'HEAD'指向相同的提交。我的猜測是他們不是,但如果你檢查他們,他們確實是差錯。 –

+0

另外,試試'git apply -v',或者使用'--check'和'-index'選項來播放。 –

3

嘗試覈對您的補丁文件 - 例如:

git apply --reject mypatch.patch 

這將顯示你的差異(如有) - 這裏是它如何可能看起來像一個例子:

error: patch failed: <filename>:<linenumber> 
error: while searching for : 
    cout << "}" << endl; // example of a line in your patch 
+0

它看起來那裏,但它仍然給這個錯誤 –