2010-11-10 1 views
6

При использовании «git add» с шаблоном файла он только рекурсивно добавляет неиспользуемые файлы и игнорирует измененные, если они не находятся в текущей папке.Правильное поведение git для «git add» с подпапками?

Пример:

$ git status 
# On branch master 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: level1/test1.txt 
#  modified: level1/level2/test1.txt 
# 
# Untracked files: 
# (use "git add <file>..." to incldude in what will be committed) 
# 
#  level1/test2.txt 
#  level1/level2/test2.txt 
no changes added to commit (use "git add" and/or "git commit -a") 
$ git add level1\*.txt 
$ git status 
# On branch master 
# Changes to be committed: 
#  new file: level1/level2/test2.txt 
#  new file: level1/test2.txt 
# 
# Changed but not updated: 
#  modified: level1/level2/test1.txt 
#  modified: level1/test1.txt 
# 

После того, как я выполнить git add level1\*.txt, неотслеживаемые (test2.txt) файлы будут добавлены, но не измененные файлы (test1.txt). Я пробовал с параметром -u, экранированием и отсутствием звездочки и т. Д., Но ничто, кажется, просто не может добавить ВСЕ файлы, соответствующие шаблону, независимо от того, отслеживаются они или нет.

Конечно, в этом примере я мог бы просто добавить все файлы с -A, но имейте в виду, что это просто для цели этого вопроса, на самом деле будет больше файлов, и я бы не хотел их добавлять , а иерархия - несколько папок глубже. Единственный способ добавить отслеживаемые файлы - это руководство или запись всего шаблона, за исключением имени файла, подобного этому: git add level1**.txt OR git add level1/level2/*.txt.

В документации git add: here говорится, что шаблон файла должен работать рекурсивно и ничего не говорит о отслеживаемых или невоспроизводимых файлах, и он даже дает и пример.

Я использую msysgit, но я протестировал это на Windows и Linux на всякий случай.

Я просто хочу знать. Правильно ли я интерпретирую документацию (потому что я думаю, что на основе документов это должно работать), или это так, как это должно работать? Это просто не имеет смысла для меня.

+0

Если я не уверен, непонимание вашей установки или проблему, я не могу воспроизвести это вообще. Я поставил себе задачу получить результат из git-статуса точно так же, как ваш, а затем запустил git add level1/*. Txt', и, как ожидалось, были добавлены level1/test1.txt и level1/test2.txt (один измененный, один новый файл), но не два файла в level2. (Вы ожидали, что он будет соответствовать файлам на уровне2? '*' Не работает в разных каталогах.) – Cascabel

+2

Хорошо, я считаю, что нашел то, что вы имеете в виду. Если я запустил 'git add 'level1/*. Txt" '(цитаты вызывают' * 'обработку git, а не оболочкой), я получаю ваше поведение: файлы test2 (new) добавляются, но не test1 (изменено). Интересно. (Я неправильно понял это в первый раз - считал, что '\' предназначался как разделитель каталога Windows. Я не использую msysgit.) – Cascabel

+0

(Er, в этом предыдущем комментарии '' 'должно быть' \\ '.) Я отредактировал вопрос, чтобы быть немного яснее на примере, воспроизведя это сам.Если я что-то испортил (в частности, чтобы сделать это с разделителями каталогов против экранирования обратного слэша), исправьте это! – Cascabel

ответ

1

Хорошо, может быть и ответ на этот вопрос.

Нет, это не похоже на правильное поведение вообще. git add <filepattern> должен быть эквивалентен git add file1 file2..., где это файлы, соответствующие шаблону - и это не то, что здесь происходит.

0

Это потому, что вы используете

git add level1\*.txt 

отмечает обратный слэш \. Это равно

git add 'level1*.txt' 

Чтобы получить ожидаемое поведение, использование слэш /.

Если вы просто хотите, чтобы добавить все файлы, использовать git add -A .

+0

Как довольно опытный пользователь git, я бы сказал, что это все еще неожиданное поведение. –

+0

С помощью «git add level1/*. Txt» вы добавили бы все файлы, заканчивающиеся на «.txt» в папке level1, но не в своих подпапках, таких как level2. Я знаю, что вы можете просто добавить все файлы с помощью «git add -A», но здесь дело не в этом, мы хотим, чтобы работал должным образом (чтобы соответствовать всем файлам с шаблоном ...). – bluediapente