Как `git добавить` нерекурсивно?

Когда я git add папка, все содержимое и все подпапки ставятся автоматически. Если папка содержит вложенные папки, которые я не хочу фиксировать, я должен отключить их вручную и добавить их в .gitignore после этого. Явное неуверенность кажется, что я делаю что-то неправильно здесь.

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

То, что я искал, является пошаговым add, как SVN --non-recursive, что позволяет добавлять уровни папок по уровню без постановки всего содержимого. Однако я не мог найти эту функцию для git add. Поэтому мне интересно: Каков рекомендуемый рабочий процесс git для такого нерекурсивного добавления?

Учитывая, что у других была точная противоположная проблема: Возможно, описанное выше поведение является проблемой с моей версией git (1.9.1)/settings?

Ответ 1

Добавление всей сложной иерархии каталогов - это необычная вещь (и, конечно же, не то, что происходит как часть обычного рабочего процесса разработки git), поэтому git не имеет специальной функции для нее. Вы всегда можете использовать внешний инструмент для сборки списка файлов, которые хотите добавить, и передать этот список в git add, например. для добавления файлов в текущем каталоге не рекурсивно, do

git add $(find . -type f -maxdepth 1)

В качестве альтернативы вы можете использовать

git ls-files --others --directory > file-list

чтобы создать список ненужных файлов в вашем текущем каталоге и отредактировать его в редакторе, чтобы удалить все, что вы не хотите добавлять. (Обязательно удалите file-list.) Затем вы можете использовать

git add $(cat file-list)

чтобы добавить файлы и каталоги в отредактированном списке. (Каталоги, которые вы оставляете, будут добавляться рекурсивно).

Ответ 2

Если вы хотите добавить только файлы из каталога без каких-либо других подпапок, вы можете сделать что-то вроде:

git add FolderName/\*.* 

Где *.* означает каждый файл, из каждого типа файла. Папки не имеют расширений, поэтому они не пройдут.

Ответ 3

Я дошел до этого вопроса, ища его простой заголовочный ответ: я хотел, чтобы git делал все (добавления и удаления) своей работы по add, но только для текущего каталога и ни одного из его подкаталогов. Хотя ответ @Sven Marnach близок к находке, он все равно не учитывает удаления. Но он блестяще упомянул git ls-files, которые помогли мне сделать эту работу:

git ls-files -domk | grep -v / | uniq | xargs -I'{' git add '{'

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

Также, если вы будете часто это использовать, создайте псевдоним или команду git.