2013-07-09 133 views
4

一位同事在更改項目文件的權限(他並不期望他們被提交)後做出了git commit。git倉庫中的圖像損壞

現在我們所有的圖像都「損壞」不可讀的,但我們不知道怎麼了,怎麼辦。

這裏是git show edd703783a8802284fb975e9f354394541f1bad5顯示:

diff --git a/public/bootstrap/img/glyphicons-halflings-white.png b/public/bootstrap/img/glyphicons-halflings-white.png 
index 3bf6484..c016d6b 100644 
Binary files a/public/bootstrap/img/glyphicons-halflings-white.png and b/public/bootstrap/img/glyphicons-halflings-white.png differ 

是什麼意思?

我們嘗試刪除並重新提交圖像,但問題仍然存在。只要我們在分支上切換/重新切換,圖像就會損壞。

我甚至想git revert提交,但是卻讓在更新狀態的所有圖像文件,並停止與以下錯誤:

error: 'commit' is not possible because you have unmerged files. 
hint: Fix them up in the work tree, 
hint: and then use 'git add/rm <file>' as 
hint: appropriate to mark resolution and make a commit, 
hint: or use 'git commit -a'. 
fatal: Exiting because of an unresolved conflict. 

現在我不能恢復它,並提交已推動了前幾天(並部署到開發環境),所以我不能rebase或類似的東西。

+0

你可以將它們從存儲庫中完全刪除(如果需要,在推送之前使用'git rm')? – Leeward

+0

您使用的是Windows嗎?也許你的crlf設置是錯誤的?看這裏的例子:http://stackoverflow.com/questions/1967370/git-replacing-lf-with-crlf – filmor

+0

@Leeward有很多文件(所有圖像),所以如果我可以避免刪除它們:/ –

回答

7
diff --git a/public/bootstrap/img/glyphicons-halflings-white.png b/public/bootstrap/img/glyphicons-halflings-white.png 
index 3bf6484..c016d6b 100644 
Binary files a/public/bootstrap/img/glyphicons-halflings-white.png and b/public/bootstrap/img/glyphicons-halflings-white.png differ 

這只是意味着glyphicons-halflings-white.png在該提交改變,但內容二進制和不適合用於在終端中顯示。因此,它會忽略任何實際差異,以避免破壞您的終端(終端解釋某些代碼,因此您不想將原始數據傳輸到該終端)。

下一位是更有趣:

error: 'commit' is not possible because you have unmerged files. 
hint: Fix them up in the work tree, 
hint: and then use 'git add/rm <file>' as 
hint: appropriate to mark resolution and make a commit, 
hint: or use 'git commit -a'. 
fatal: Exiting because of an unresolved conflict. 

這意味着你試圖合併和文件有衝突。發生這種情況是因爲更改所基於的版本與您合併到的分支的版本不同。從圖形上看,它看起來像這樣

     C 
     .-------------*------------. 
     /       \ 
*------*---------------*--------------+ 
A  B    D    E 

所以,讓我們說,你有這樣的更新,這些圖標(提交C)這是基於凱明B.那麼別人落在主的變化是改變了同一個特性分支文件,說提交D.現在當你嘗試合併時,提交C和D是衝突的,因爲他們觸及相同的二進制文件。 Git不理解二進制格式,所以不知道如何將它們合併在一起。您作爲用戶需要解決衝突,然後添加並提交結果。這意味着您需要檢查所有三個版本:基於提交B(合併基礎),基於提交C(MERGE_HEAD /您的版本)和基於提交D(主/版本)的基礎。你可以這樣做,看到所有的這些版本:

git show :1:path/to/file.ext > file.merge-base.ext # The merge base (commit B) 
git show :2:path/to/file.ext > file.HEAD.ext   # The version on the branch you're merging into (commit D) 
git show :3:path/to/file.ext > file.MERGE_HEAD.ext # The version on your branch (commit C) 

的命令在這些不同的版本獲得的git merge手冊頁中記錄。有關分段語法的更多信息,您可以查看Specifying Revisions section of the gitrevisions手冊頁。

您可以嘗試在提交之前恢復原始版本。它看起來像:

git show edd703783a8802284fb975e9f354394541f1bad5~1:public/bootstrap/img/glyphicons-halflings-white.png > public/bootstrap/img/glyphicons-halflings-white.png 
git commit -M "Revert the last set of changes made to icons." public/bootstrap/img/glyphicons-halflings-white.png 

當從樹的頂部運行。您也可以選擇讓您的版本:

git checkout --ours # Keeps the version on master (commit D, the :2: version) 

或者,

git checkout --theirs # Keeps the version from your branch (commit C, the :3: version) 

然後您需要添加文件並提交解決合併。

最後,如果你還沒有這樣的線在你.gitattributes文件,你可能要考慮:

*.png binary 

這意味着處理二進制文件二進制。 Git不會嘗試合併文件內容。通常情況下,git通過在前100個字節(IIRC)中查找NUL字符來執行二進制檢測。我不記得PNG格式,但也許有可能不保證在前100個字節中有一個,所以git可能會嘗試合併文件的內容並插入衝突標記。這會以圖像程序或瀏覽器無法查看的方式破壞圖像,我懷疑這是發生在您身上的事情。你的.gitattributes文件中的上面一行將確保git不會插入衝突標記,並且可以避免嘗試將分支之間未提交的更改合併到.png文件。

+0

感謝您修復錯字@eric! – jszakmeister

+0

沒問題。真的很好,詳細的答案。 – Eric

+0

'這意味着你試圖合併,文件有衝突'>我沒有嘗試合併。這是'git revert'命令的結果。目前沒有分支機構,一切都發生在一個分支上。所以謝謝你的詳細答案,但我想(如果我正確地讀)它不適用於我的問題? –