2013-07-09 3 views
4

Коллега совершил git-фиксацию после изменения прав доступа к файлам проекта (он не ожидал, что они будут совершены).Поврежденные изображения в репозитории 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. 

Теперь я не могу вернуть в исходное состояние, и фиксации было нажал несколько дней назад (и развернулся в среду Dev), поэтому я не могу переустанавливать или что-то подобное.

+0

Вы можете удалить их из хранилища (используя git rm' перед нажатием, если необходимо)? – Leeward

+0

Вы используете Windows? Может быть, ваши настройки crlf неверны? Посмотрите здесь, например: http://stackoverflow.com/questions/1967370/git-replacing-lf-with-crlf – filmor

+0

@ У меня много файлов (все изображения), поэтому, если я могу избежать их удаления:/ –

ответ

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. Теперь, когда вы пытаетесь объединиться, commit C и D конфликтуют, потому что они касаются одного и того же двоичного файла. Git не понимает бинарные форматы и поэтому не знает, как объединить их вместе. Вы, как пользователь, должны разрешить конфликт, а затем добавить и зафиксировать результат. Это означает, что вам нужно изучить все три версии: одно на основе commit B (база слияния), то есть на основе commit C (MERGE_HEAD/ваша версия), а также на основе commit D (HEAD/version on master). Вы можете увидеть каждое из этих версий, делая это:

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 выполняет двоичное обнаружение путем поиска символа NUL в первых 100 байтах (IIRC). Я не помню формат PNG, но, возможно, возможно, что в первых 100 байт не гарантировано, поэтому git может попытаться объединить содержимое файла и вставить маркеры конфликтов. Это испортило бы изображение таким образом, что оно не может быть просмотрено программами изображений или браузером, и я подозреваю, что это случилось с вами. Вышеприведенная строка в вашем файле .gitattributes гарантирует, что git не вставляет маркеры конфликтов, и он избегает попытки объединить незафиксированные изменения между ветвями в .png-файлы.

+0

Спасибо за исправление опечаток @eric! – jszakmeister

+0

Нет проблем. Действительно большой, подробный ответ. – Eric

+0

'Это означает, что вы пытались слить, и файл имел конфликты'> Я не пытался слить. Это было результатом команды 'git revert'. На кону нет никаких ветвей, все происходит на одной ветке. Так спасибо за подробный ответ, но я думаю (если я правильно прочитал), что это не относится к моей проблеме? –

Смежные вопросы