2014-08-23 4 views
3

Я смотрю репозиторий git довольно крупного проекта, чей набор тестов посыпается несколькими файлами в разных суб- каталоги. Все имена файлов тестов соответствуют одному и тому же шаблону (например, test-*). Учитывая это, как мне перечислить новейшие тестовые случаи, переданные в репозиторий?Найти последние файлы (ы), добавленные в репозиторий git с именами, соответствующими заданному шаблону подстановки

Я не слишком частности, о том, являются ли эти коммиты создать тестовый случай или просто Последнее изменение прецедентом. Либо все в порядке. Я просто хочу увидеть некоторые из новых тестов, написанных/измененных вкладчиками проекта.

Насколько я могу разобрать:

git log -- */test* 

только показывает, что совершает касание тестовые примеры один уровень вниз в иерархии, а не ниже.

+0

Я просто попробовал 'git log - */test *' на фиктивном репо, и он показывает записи журнала, в которых, например, было создано 'foo/bar/test1.py'. Какую версию Git вы используете? Я запускаю Git 2.0.1. – Jubobs

+0

@Jubobs - в какой версии git вы работаете? Шахта (1.8.4) этого не делает. – ArjunShankar

+0

Я отправлю пример моего ребенка, показывающий, что он работает в Git 2.0.1. Возможно, источник изменился между вашей версией и моей ... – Jubobs

ответ

5

Если */test* соответствует некоторым файлам, оболочка расширит это выражение. Попытайтесь:

echo */test* 

в командной строке. Сравните, например:

$ cd /tmp 
$ mkdir empty 
$ cd empty 
$ echo */test* 
*/test* 

/tmp/empty пуст, так */test* не совпадает ни с чем.Но тогда:

$ mkdir dir; touch dir/test.file 
$ echo */test* 
dir/test.file 

Так что, если вы не имеете ничего соответствие */test* и запуск:

$ somegitcommand */test* 

команда мерзавец будет видеть */test* в качестве аргумента; но если у вас есть что-то, что соответствует, команда git увидит в качестве аргумента dir/test.file. * s исчезли.

Исправление действительно супер-простой: процитировать */test* части:

$ git log --oneline -- '*/test*' 

git log Теперь будет видеть */test*, а не dir/test.file и мерзавец будет в состоянии сделать рекурсивное согласование.


Следует отметить, что не все раковины ведут себя одинаково. В CSH и Tcsh, если нет совпадения для Glob оболочки, как */test.*, вы получите:

> rm -r dir 
> echo */test* 
echo: No match. 

В Баш, вы можете выбрать поведение:

bash$ echo */test* 
*/test* 
bash$ shopt -s failglob 
bash$ echo */test* 
bash: no match: */test* 

(на самом деле вы можете сделать то же самое в csh и tcsh, оно просто инвертируется: set nonomatch и */test* передается до echo).

Кроме того, это иллюстрирует разницу между подстановочным подстановочным шрифтом оболочки (который не рекурсирует в подкаталоги) и git (что делает). См. Jubobs' answer и попробуйте (в оболочке) echo */*/test* vs echo */test* (все без кавычек). Некоторые оболочки имеют рекурсивное глобирование, которое может быть включено различными способами, например, с использованием ** для указания рекурсии: echo **/test*.


Последнее замечание: соответствие шаблону Git и несколько изменилось с одной версии на другую, особенно в .gitignore файлах. В частности, **, что означает «нуль или более каталогов» (в частности, в файлах .gitignore), был добавлен в git в version 1.8.2.

+0

Странно. Кажется, это работает без кавычек в моем примере. Я что-то пропустил? – Jubobs

+0

@Jubobs: все ваши тестовые файлы находятся на нескольких уровнях. Попробуйте диагностику 'echo */test *'!:-) Обратите внимание, что соответствие git позволяет каталогам, а оболочка - нет. – torek

+0

@Jubobs: точно. Вот почему я действительно предпочитаю, чтобы по умолчанию csh просто не выполнял команду: вы не привыкли к тому, чтобы иметь такие выражения, как, например, '[af] [af]', потому что все ваши собственные имена файлов имеют длину 3 символа или больше, только чтобы он неожиданно неожиданно раскрылся в первый раз, когда вы находитесь в каталоге с файлом с именем 'ed'. – torek

1

Использование git diff перечислить все недавно изменилось tests:

git diff --stat HEAD^ -- '**/test*' 
path/to/test_x  | 17 ----------------- 
path/to/test_y  | 1 + 
2 files changed, 1 insertions(+), 17 deletions(-) 
+0

Откуда вы получаете '3.days.ago'? Я не думаю, что OP знает временную метку последней фиксации, которая добавила тестовые файлы в репо. – Jubobs

+0

Это действительно работает. +1 – ArjunShankar

2

Отказ от ответственности: Это не полная картина; Я оставляю этот ответ в прямом эфире, потому что torek ссылается на него в his much more complete answer.

Я использую Git 2.0.1 в Баш, и я не могу воспроизвести поведение вы описываете: как показано ниже,

git log -1 -- */test* 

показывает коммиты, что добавить/удалить/изменить файлы, которые соответствуют test* два выравнивает иерархию рабочего дерева. Возможно, обработка шаблонов glob изменена между v1.8.3 и v2.0.1. Рассмотрите возможность обновления до более поздней версии.

# set things up 
cd ~/Desktop 
mkdir babyexample 
cd babyexample 
git init 

# add three test files under foo/bar/ 
mkdir foo 
cd foo 
mkdir bar 
cd bar 
touch test1.py 
touch test2.c 
touch testmypatience.baz 
cd ../.. 
git add . 
git commit -m "add three test files" 

# add a README 
touch README.md 
git add README.md 
git commit -m "add README" 

# remove test1.py 
git rm foo/bar/test1.py 
git commit -m "remove Python file" 

# modify test2.c 
printf "hello\n" > foo/bar/test2.c 
git add test2.c 
git commit -m "say hello in C file" 

Затем

git log --oneline 

выходы

9537199 say hello in C file 
20b90f2 remove Python file 
494cf11 add README 
bfb6686 add three test files 

тогда

git log --oneline -- */test* 

фильтры на выходе журнала, как и ожидалось:

9537199 say hello in C file 
20b90f2 remove Python file 
bfb6686 add three test files 
+0

Хмм, так что все это, наконец, объясняется расширением оболочки. Поскольку недостающее совпадение приводит к тому, что * передается 'git', который затем использует его правильно. – ArjunShankar

+1

@ArjunShankar Да :) Я был в отъезде, но Торек нашел ответ. – Jubobs

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