Как выполнить git diff для типа файла или расширения [duplicate]

Что вы спрашиваете, почему это:

def func(a=[], b = 2):
    pass

не является внутренне эквивалентным этому:

def func(a=None, b = None):
    a_default = lambda: []
    b_default = lambda: 2
    def actual_func(a=None, b=None):
        if a is None: a = a_default()
        if b is None: b = b_default()
    return actual_func
func = func()

, за исключением случая прямого вызова func (None , None), которые мы будем игнорировать.

Другими словами, вместо оценки параметров по умолчанию, почему бы не сохранить их каждый из них и оценить их при вызове функции?

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

105
задан Andrew Marshall 18 December 2011 в 23:03
поделиться

8 ответов

Да, если вы убедитесь, что git расширяет glob, а не вашу оболочку, то он будет соответствовать на любом уровне, поэтому что-то вроде этого (кавычки важны) должно работать нормально.

git diff -- '*.c' '*.h'
154
ответ дан CB Bailey 21 August 2018 в 00:32
поделиться
  • 1
    Кажется, это не работает для меня. – Mat 18 December 2011 в 23:42
  • 2
    @Mat: Он работает для меня, я тестировал его на моем git.git-клоне. – CB Bailey 18 December 2011 в 23:46
  • 3
    Хорошо, моя версия git была слишком старой. Работает в соответствии с 1.7.8. Отлично. – Mat 19 December 2011 в 07:57
  • 4
    Шахта работала с расширением скобы, a la git diff -- *.{c,h,etc} – Matt Fletcher 25 November 2013 в 18:03
  • 5
    двойная тире важна, например. git diff master HEAD -- "*filename.txt" также полезно git diff master HEAD --name-only – neaumusic 2 March 2015 в 23:36

git diff будет показывать только различия в неустановленных файлах.

Я нашел этот вопрос, потому что я хотел исключить файлы .info из git diff. Я достиг этого, выполнив его с помощью git add *.info, что уменьшает оставшиеся файлы.

0
ответ дан Alan Whitelaw 21 August 2018 в 00:32
поделиться

Чтобы включить рекурсивные файлы (включая текущий каталог), это сработало для меня:

git diff -- '***.py'
1
ответ дан Bohumir Zamecnik 21 August 2018 в 00:32
поделиться

Аргумент командной строки для расширения.

git diff *.py

В качестве альтернативы вы можете передать find в git diff:

find . -name '*.py' -type f | git diff --
0
ответ дан hughdbrown 21 August 2018 в 00:32
поделиться
  • 1
    пожалуйста, сделайте ответ более читабельным. Вы могли бы хватить git diff *.py и без кричащих заголовков – sehe 18 December 2011 в 23:16
  • 2
    «Заголовки криков» были # -комментами в сценарии оболочки. – hughdbrown 19 December 2011 в 01:22

Либо используйте globstar вашей оболочки (который выполняет рекурсивный поиск) 1,2:

shopt -s globstar 
git diff -- *.py **/*.py
, либо используйте find:
find -name '*.py' -print0 | xargs -0 git diff --
Оба они являются специальными именами и пробелами. Хотя вы можете захотеть отфильтровать каталоги с расширением .py :) 1 Мне нравится делать git diff -- {.,**}/*.py обычно 2 Когда globstar включен, git diff -- **/*.py уже включает ./*.py. В man-странице Bash: «Если за ним следует /, два соседних * s будут соответствовать только каталогам и подкаталогам».

8
ответ дан Jay 21 August 2018 в 00:32
поделиться

Для простых шаблонов файлов это работает:

$ git ls-files -zm '*.txt' | xargs --null git diff

Пробел безопасен, и вы также можете иметь несколько расширений:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
1
ответ дан Mat 21 August 2018 в 00:32
поделиться

Я закончил с этим:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

Это показывает diff для указанного коммита только в том случае, если имя файла содержит слово «тест» (нечувствительное к регистру) и не заканчивается на .sql, изменять трубопровод, необходимый для вашего дела.

0
ответ дан MatrixManAtYrService 21 August 2018 в 00:32
поделиться

Ни один из приведенных выше ответов не работает для меня в git bash для Windows. Я не уверен, что это версия (я использую 1.8.4) или Windows / bash; также, в моем случае, я хотел разделить две ветви, в которых у каждой ветви были дополнительные файлы, отсутствующие в другой ветке (таким образом, «находки» основаны на ошибках).

В любом случае это сработало для меня (в мой пример, поиск разницы между файлами python):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
0
ответ дан Yonatan 21 August 2018 в 00:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: