git clean хочет удалить игнорируемый каталог [duplicate]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

9
задан basin 18 April 2014 в 07:34
поделиться

4 ответа

Да, git clean, похоже, ведет себя противоположно документам, удалив игнорируемый файл, даже если -x / -X не указан.

Кажется, что опция -d переопределяет отсутствие -x / -X. То есть, git clean -df удалит неподготовленные каталоги, даже если они содержат незатребованные, но проигнорированные файлы .

Я не знаю, является ли это надзором или преднамеренным, но manpage явно неполна в этом отношении. Вы можете рассмотреть возможность отправки патча для manpage в список рассылки git.

BTW, та же проблема обсуждается в вопросе . Как сохранить все проигнорированные файлы в git clean -fd? . Там отмечается, что git clean -df не будет удалять каталоги, которые находятся в .gitignore. Поэтому, чтобы сохранить ваш conf/, вы можете добавить его в .gitignore.

0
ответ дан Community 16 August 2018 в 08:01
поделиться

Чтобы получить нужное поведение, защищая неподписанный каталог из 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 продукты.

0
ответ дан jthill 16 August 2018 в 08:01
поделиться
  • 1
    "git полностью игнорирует conf / sar / & quot; - ложный. conf все еще удален – basin 2 June 2014 в 07:52
  • 2
    & gt; git clean -f " - ничего не делает – basin 2 June 2014 в 07:53
  • 3
    Вы правы, я забыл, что /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 делает именно то, что говорит документация.

4
ответ дан mvp 16 August 2018 в 08:01
поделиться
  • 1
    В качестве побочного примечания: вероятно, лучше всего поместить файл .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 должны быть пропущены (поскольку они содержат игнорируемые пути), а какие не пропустить.

4
ответ дан VonC 16 August 2018 в 08:01
поделиться
Другие вопросы по тегам:

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