Вынудите мерзавца добавить dotfiles к репозиторию

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

Как прикладной программист, с точки зрения безопасности это означает, что вам не нужно беспокоиться об имени файла, содержащем нулевые байты, если вы уверены, что у вас есть имя файла. С другой стороны, если вам дали строку и сказали использовать ее в качестве имени файла, например, если вы программируете сервер и позволяете клиенту выбирать имена файлов, вам нужно убедиться, что эта строка не содержит ноль байт. Это всего лишь одно требование среди прочих, включая длину строки, наличие разделителя каталогов (/ или \), зарезервированные имена (. и .., зарезервированные имена файлов Windows, такие как nul.txt или prn ]) и т. д. В большинстве систем Unix в их собственной файловой системе существуют ограничения для имени файла: нулевой байт или косая черта, длина от 1 до некоторого максимума и два имени . и .. зарезервированы. Windows и не родные файловые системы в Unix имеют дополнительные ограничения (можно поставить / в имени файла через прямые обращения к ядру в Windows).

Чтобы поместить нулевой байт в содержимое файла, просто запишите строку в файл, используя любой язык, который допускает нулевые байты в строках. В bash вы не можете хранить нулевой байт в строке, поэтому вам нужно использовать другой метод, такой как printf '\0' или echo "abc" | tr b '\0'.

29
задан Shubham 10 December 2018 в 10:03
поделиться

3 ответа

Вы можете добавить их конкретно по пути, например,

git add */.*

или

find . -name '.[a-z]*' -exec git add '{}' ';'

(Хорошо быть осторожным с -name, потому что вы не обязательно хотите подобрать каждый каталог с его записью ..)

Но на данный момент самый простой способ сделать это с помощью git gui . Просто нажмите на файлы.

15
ответ дан Norman Ramsey 28 November 2019 в 01:42
поделиться

Интересно, что под windows 10 с git version 2.12.0.windows.1, работающим под «Git-Bash», «git add. *» Тоже не работает. Такие файлы, как .classpath, .project и т. Д. Не добавляются и, следовательно, не фиксируются. Но хорошо, это неправильная точка для отправки отчета об ошибке.

1
ответ дан Angel O'Sphere 28 November 2019 в 01:42
поделиться

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 , то они игнорируются, и "!. *" - правильный способ "отменить игнорирование" их. Но чтобы быть эффективным, этот шаблон должен быть в правильном месте. Игнорирования обрабатываются в следующем порядке:

  • .gitignore непосредственно содержащего каталога, затем
  • .gitignore родительского каталога (каждый родительский до корня репозитория), затем
  • $ GIT_DIR / info / exclude , затем
  • файл, сообщенный git config core.excludesfile (который может быть установлен
    • $ GIT_DIR / config ,
    • $ HOME / .gitconfig или
    • файлом конфигурации системы ( попробуйте GIT_EDITOR = echo git config --system --edit , чтобы получить его путь)).

Когда имя пути совпадает с шаблоном в одном файле, последующие файлы не запрашиваются. Последний матч в каждом файле «выигрывает». Шаблон в $ GIT_DIR / info / exclude никогда не может переопределить шаблон в файле .gitignore . Итак, если файлы игнорируются (согласно git ls-files --exclude-standard -oi ) и если "!. *" В , $ GIT_DIR / info / exclude неэффективен , затем проверьте все соответствующие файлы .gitignore на предмет виновника.

30
ответ дан 28 November 2019 в 01:42
поделиться
Другие вопросы по тегам:

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