Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Да, git clean
, похоже, ведет себя противоположно документам, удалив игнорируемый файл, даже если -x
/ -X
не указан.
Кажется, что опция -d
переопределяет отсутствие -x
/ -X
. То есть, git clean -df
удалит неподготовленные каталоги, даже если они содержат незатребованные, но проигнорированные файлы .
Я не знаю, является ли это надзором или преднамеренным, но manpage явно неполна в этом отношении. Вы можете рассмотреть возможность отправки патча для manpage в список рассылки git.
BTW, та же проблема обсуждается в вопросе . Как сохранить все проигнорированные файлы в git clean -fd? . Там отмечается, что git clean -df
не будет удалять каталоги, которые находятся в .gitignore
. Поэтому, чтобы сохранить ваш conf/
, вы можете добавить его в .gitignore
.
Чтобы получить нужное поведение, защищая неподписанный каталог из git clean -d
и выборочно удаляя контент из этих неподготовленных каталогов, вы должны явно игнорировать весь самый верхний неподписанный каталог, в вашем случае
echo /conf/ >>.gitignore # or .git/info/excludes if it's just you
Теперь git clean
не рекурсирует в неподготовленные каталоги, но, к счастью, это простая ручка:
# recursive x-ray git clean with various options:
git ls-files --exclude-standard '-x!*/' -oz | xargs -0 rm -f #
git ls-files -oz | xargs -0 rm -f # -x
git ls-files --exclude-standard '-x!*/' -oiz | xargs -0 rm -f # -X
(или git ls-files --exclude-standard '-x!/conf/'
, чтобы пропустить только одну спецификацию). Одиночные кавычки существуют, потому что !
является синтаксисом интерактивной оболочки для вытягивания фрагментов предыдущих команд.
Чтобы очистить пустые каталоги, вы можете приблизиться к желаемому поведению с помощью
find -depth -type d -empty -delete
# -delete is -exec rm -f '{}' ';' on non-GNU userlands
Но это действительно принадлежит рецепту make-файла, а затем партия mkdir -p
s для воссоздания любой из структуры, которую вы хотите сохранить, даже если она пуста, поскольку make
создан для управления переходными процессами, такими как build / test / install продукты.
/conf/
также не отслеживается и, по-видимому, никогда не использовал git clean -f
без -d
в каталоге, где я ожидал, что он будет рекурсивным. Теперь лучше?
– jthill
3 June 2014 в 00:01
Согласно man git clean
:
-d
Remove untracked directories in addition to untracked files.
В вашем случае каталог conf/sar
не отслеживается - он не содержит файлов, которые отслеживаются git. Если у вас не было правила gitignore и выполнено git clean -fd
, содержимое этого неподготовленного каталога было бы удалено - то, что говорит документация.
Теперь, если вы добавите .gitignore
с правилом, чтобы игнорировать *.sar
файлов, это не меняет основной факт, что ваш каталог conf/sar/
по-прежнему не отслеживается, и имеющий необработанный файл aaa.sar, который имеет право на это правило gitignore, не должен внезапно сделать его неустранимым git clean -fd
.
Но если вы добавите какой-либо файл отслеживания рядом с вашим игнорированным aaa.sar
, то этот каталог не будет удален, и ваш файл останется в покое.
Другими словами, хотя это выглядит запутанным, это не ошибка и git делает именно то, что говорит документация.
.gitignore
, игнорирующий *.sar
в самом каталоге sar
. Это не только делает уборщик верхнего уровня .gitignore
и продолжает игнорировать информацию там, где они необходимы, но также имеет дополнительное преимущество в том, чтобы поддерживать этот каталог в памяти как упоминавшийся @mvp.
– Shahbaz
4 June 2014 в 10:03
Предупреждение: поведение git clean
будет немного изменяться с помощью Git 2.14 (Q3 2017)
"git clean -d"
, используемого для очистки каталогов, которые игнорировали файлы, хотя команда не должна терять проигнорированные без "-x
". "git status --ignored
" не перечислил проигнорированные и не проверенные файлы без "-uall
".
См. commit 6b1db43 ( 23 мая 2017 г.) и commit bbf504a , commit fb89888 , commit df5bcdf , commit 0a81d4a , commit b3487cc (18 мая 2017 г.) Самуэль Лиджин (sxlijin
) . (Слияние Юнио С Хамано - gitster
- в commit f4fd99b , 02 июня 2017 г.)
clean
: преподаватьclean -d
для сохранения игнорируемых путейСуществует неявное предположение, что каталог, содержащий только Неотслеживаемые и проигнорированные пути сами по себе считаются неотслеживаемыми. Это имеет смысл в случаях использования, когда мы спрашиваем, следует ли добавлять каталог в базу данных git, но не тогда, когда мы спрашиваем, можно ли безопасно удалить каталог из рабочего дерева ; в результате
clean -d
предположил бы, что «untrecked» каталог, содержащий проигнорированные пути, может быть удален, хотя это также приведет к удалению игнорируемых путей.Чтобы обойти это, мы преподаем
clean -d
собирать проигнорированные пути и пропускать неподписанную директорию, если она содержит проигнорированный путь, вместо этого просто удаляет неотображенное содержимое. Чтобы достичь этого,cmd_clean()
должен собирать все необработанное содержимое неподготовленных каталогов, в дополнение ко всем игнорируемым путям, для определения того, какие необработанные dirs должны быть пропущены (поскольку они содержат игнорируемые пути), а какие не пропустить.