2010-06-17 6 views
453

Мне просто нужен простой список конфликтующих файлов.Каков самый простой способ получить список конфликтующих файлов?

Есть ли что-нибудь проще, чем:

git ls-files -u | cut -f 2 | sort -u 

или

git ls-files -u | awk '{print $4}' | sort | uniq 

?

Я думаю, я мог бы создать удобный псевдоним для этого, однако задавался вопросом, как это делают профессионалы. Я бы использовал его для написания циклов оболочки, например. для автоматического разрешения конфликтов и т. д. Может быть, заменить этот цикл, подключив к mergetool.cmd?

+3

да, вы можете сделать sort -u вместо сортировки | uniq: P – Unknown

+0

классный, это хорошо знать, спасибо - мог бы пометить Q с помощью 'sort' или shell-scripting;) – inger

+0

Я мог бы смутить, но почему вы не можете создать псевдоним Git (или вы ссылались на них когда вы упомянули «псевдоним»?)? https://git.wiki.kernel.org/index.php/Aliases – Makis

ответ

800
git diff --name-only --diff-filter=U 
+1

выглядит хорошо, кажется, работает - спасибо! Знаете ли вы, с каких пор доступен фильтр -diff? – inger

+1

@inger: '--diff-filter' доступен с v0.99. –

+0

Спасибо - интересно, как мы пропустили это до сих пор. Это решение занимает ровно столько же символов, что и выше: голова к голове :) – inger

31

Пытаясь ответить на мой вопрос:

Нет, не кажется, нет какой-либо простой способ, чем в вопросе, из коробки.

После ввода, что слишком много раз, только что вставили короче один в исполняемый файл с именем «GIT-конфликты», сделал доступным для мерзавец, теперь я могу просто: git conflicts, чтобы получить список я хотел.

Обновление: как предполагает Ричард, вы можете настроить GIT псевдоним, в качестве альтернативы к исполняемым

git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u' 

Преимущество использования исполняемого над псевдонимом является то, что вы можете поделиться, что сценарий с членами команды (в двоичной части репо).

+1

Я чувствовал то же самое в тот момент - думая, как, черт возьми, люди не нуждаются в этом, и видя, насколько тривиальным было обходное решение. Тем не менее, я использую git уже 2 года и честно не сталкивался с этим «ограничением» еще раз. Так, может быть, это не так много общего в конце концов? – inger

+4

Это достаточно просто, что вы можете настроить псевдоним для него 'git config --global alias.conflicts"! Git ls-files -u | cut -f 2 | sort -u "' (это означает, что вы запускаете эту команду оболочки , а не просто команда git). – Richard

+1

Стоит упомянуть, что вы действительно хотите «одиночные кавычки» вместо «двойных кавычек». В противном случае '!' Будет интерпретироваться вашей оболочкой: 'git config --global alias.conflicts '! Git ls-files -u | cut -f 2 | sort -u'' – umop

2

Если вы попытаетесь зафиксировать, а если есть конфликты, git предоставит вам список нерешенных конфликтов ... но не как обычный список. Обычно это то, что вы хотите, работая в интерактивном режиме, потому что список становится короче, когда вы исправляете конфликты.

+1

"интерактивно, потому что список становится короче, когда вы исправляете конфликты". Интересно. Для этой цели я всегда использовал mergetool. – inger

15

git status отображает «и модифицированные» рядом с файлами, которые имеют конфликты вместо «модифицированного» или «новый файл», и т.д.

+2

Это правда. Однако этот конкретный вопрос касался простого списка конфликтующих файлов. Это может быть проблема XY (я не могу вспомнить, почему мне действительно нужен этот список конфликтов, но тот факт, что я не нуждался в нем, мог бы предположить, что я должен после этого другой подход. Не уверен теперь .. Я также писал сценарии для автосогласования java-импортных конфликтов, которые нуждались в этом списке, то есть неинтерактивном использовании). – inger

+0

О, я этого не понимал. Я думал, что вам нужен «нормальный» список для «нормального» использования. Вот почему я испугался своим собственным кодом и вашим ответом ... тогда я понял, что «обе модифицированные» вещи работали для меня (и я предположил, что вы просто хотели того же, что и я, почему бы и нет?); P) Спасибо за upvote, хотя :) – Rafa

16
git status --short | grep "^UU " 
+3

Примечание: вам может потребоваться также поиск^UA и^UD, поэтому следующий шаблон более полный: «^ U [UAD]» – mda

+0

или просто '^ U', чтобы получить все начиная с U – Ascherer

+6

Этого недостаточно. Конфликтующие файлы могут иметь следующие комбинации: 'DD, AU, UD, UA, DU, AA, UU' –

14

Вот дурак-доказательство способ:

grep -H -r "<<<<<<< HEAD" /path/to/project/dir 
+5

Нет. Индекс Git по-прежнему будет помечать определенные файлы как конфликтующие даже после удаления текстовых меток в файлах. –

+5

Наряду с комментарием Александра, по-прежнему полезно видеть это как вариант :) Пожалуйста, не удаляйте. – WoodenKitty

+1

Или для запуска в текущем рабочем каталоге используйте точку для пути - 'grep -H -r" <<<<<<< HEAD ". –

0

Я всегда использовал git status.

может добавить awk в конце, чтобы получить только имена файлов

git status -s | grep ^U | awk '{print $2}'

-1

небольшое изменение ответа Чарльз Бейли, что дает больше информации:

git diff --name-only --diff-filter=U | xargs git status 
+0

Не работает для меня, вместо этого распечатывает подробный комментарий. –

3

Может быть, это было добавлено в Git , но файлы, которые еще не решены, перечислены в сообщении о состоянии (состояние git) следующим образом:

# 
# Unmerged paths: 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# both modified:  syssw/target/libs/makefile 
# 

Обратите внимание, что это раздел «Без проблем».

10

вы можете нажать git ls-files -u на командной строке перечисляются вниз файлы с конфликтами

6

Это работает для меня:

git grep '<<<<<<< HEAD'

или

git grep '<<<<<<< HEAD' | less -N

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