Невозможно создать имя файла, содержащее нулевой байт, через API POSIX или Windows. На всех известных мне Unix-системах невозможно создать имя файла, содержащее нулевой байт, даже с помощью приложения с плохим поведением, которое обходит нормальный API, потому что само ядро обрабатывает все свои входные данные имени файла как нулевые. строки Я верю, что это верно и для Windows, но я не совсем уверен.
Как прикладной программист, с точки зрения безопасности это означает, что вам не нужно беспокоиться об имени файла, содержащем нулевые байты, если вы уверены, что у вас есть имя файла. С другой стороны, если вам дали строку и сказали использовать ее в качестве имени файла, например, если вы программируете сервер и позволяете клиенту выбирать имена файлов, вам нужно убедиться, что эта строка не содержит ноль байт. Это всего лишь одно требование среди прочих, включая длину строки, наличие разделителя каталогов (/
или \
), зарезервированные имена (.
и ..
, зарезервированные имена файлов Windows, такие как nul.txt
или prn
]) и т. д. В большинстве систем Unix в их собственной файловой системе существуют ограничения для имени файла: нулевой байт или косая черта, длина от 1 до некоторого максимума и два имени .
и ..
зарезервированы. Windows и не родные файловые системы в Unix имеют дополнительные ограничения (можно поставить /
в имени файла через прямые обращения к ядру в Windows).
Чтобы поместить нулевой байт в содержимое файла, просто запишите строку в файл, используя любой язык, который допускает нулевые байты в строках. В bash вы не можете хранить нулевой байт в строке, поэтому вам нужно использовать другой метод, такой как printf '\0'
или echo "abc" | tr b '\0'
.
Вы можете добавить их конкретно по пути, например,
git add */.*
или
find . -name '.[a-z]*' -exec git add '{}' ';'
(Хорошо быть осторожным с -name
, потому что вы не обязательно хотите подобрать каждый каталог с его записью .
.)
Но на данный момент самый простой способ сделать это с помощью git gui
. Просто нажмите на файлы.
Интересно, что под windows 10 с git version 2.12.0.windows.1, работающим под «Git-Bash», «git add. *» Тоже не работает. Такие файлы, как .classpath, .project и т. Д. Не добавляются и, следовательно, не фиксируются. Но хорошо, это неправильная точка для отправки отчета об ошибке.
git add.
и git add dir / .dot
отлично работают у меня с неукрашенными версиями Git 1.6.6.1 и 1.7.0, которые сейчас у меня под рукой.
% git --version
git version 1.6.6.1
% git ls-files -o
.baz/baz
.foo
bar/.bar
quuux/quuux
quux
% git add .
% git ls-files -o
% git ls-files
.baz/baz
.foo
bar/.bar
quuux/quuux
quux
Какую версию Git вы используете? Действительно ли ваши подкаталоги являются подмодулями (которые управляются независимо)?
«точечные файлы» не исключаются по умолчанию, но, возможно, в какой-то части конфигурации в вашей системе, репозитории или рабочем дереве они установлены таким образом. Если они появляются в git ls-files --exclude-standard -oi
, то они игнорируются, и "!. *" - правильный способ "отменить игнорирование" их. Но чтобы быть эффективным, этот шаблон должен быть в правильном месте. Игнорирования обрабатываются в следующем порядке:
git config core.excludesfile
(который может быть установлен
GIT_EDITOR = echo git config --system --edit
, чтобы получить его путь)). Когда имя пути совпадает с шаблоном в одном файле, последующие файлы не запрашиваются. Последний матч в каждом файле «выигрывает». Шаблон в $ GIT_DIR / info / exclude никогда не может переопределить шаблон в файле .gitignore . Итак, если файлы игнорируются (согласно git ls-files --exclude-standard -oi
) и если "!. *" В , $ GIT_DIR / info / exclude неэффективен , затем проверьте все соответствующие файлы .gitignore
на предмет виновника.