2010-05-05 5 views
0

У меня есть GIT псевдоним (git undo), который уничтожает все в рабочем каталоге, в том числе новых файлов, измененные файлы и удаленные файлы:мерзавца отменить псевдоним с xargs

!git reset --hard && git ls-files -d | xargs -0 git rm --ignore-unmatch && git clean -fq 

На OS X, это прекрасно работает. Однако в Linux я столкнулся с следующей проблемой: если файлы не были удалены из репозитория, команда git ls-files -d | xargs -0 git rm --ignore-unmatch потерпит неудачу (xargs ничего не будет передано).

Есть ли способ иметь xargs тихо двигаться дальше, если он ничего не получает от git ls-files?

+2

Если вы прохождение '-0' опция' xargs' то важно, что вы также использовать '-z' с' git ls-files'. –

+0

Обратите внимание, что для отмены * всего * вы можете (или не можете) хотеть сказать 'git clean -qfdx' (см.' Git help clean') –

ответ

3

С git reset --hard перед этим, git ls-files -d никогда не должен генерировать какой-либо вывод (и если это так, вы хотели бы использовать git ls-files -d -z, чтобы он производит NUL заканчивающегося выхода для xargs -0).

После того как вы сделали git reset --hard, отслеживаемая часть рабочего дерева и весь индекс будут соответствовать фиксации HEAD. git ls-files -d будет показывать файлы только в индексе, но не в рабочем дереве. Поскольку рабочее дерево будет иметь все, что имеет индекс, никогда не должно быть никаких удаленных файлов после жесткого сброса.

git clean бит полезно удалить неотслеживаемые файлы (которые git reset --hard не трогать), но вы можете изменить его на git clean -dfq также удалить полностью неотслеживаемые каталоги).

+0

Ahhh, ладно - я вижу. Кажется, вы пытаетесь сделать слишком много сразу. – ABach

2

От man page:

--no-вводный, если пусто, -r
Если стандартный ввод не содержит никаких nonblanks, не запускать
команды. Обычно команда запускается один раз, даже если есть
нет ввода. Этот параметр является расширением GNU.

Убедитесь, что версия xargs имеет такую ​​возможность (man xargs)

+0

Это похоже на ответ - странно, что версия Xargs OS X не имеет значения, t имеет эту опцию (или использует ее по умолчанию). Полагаю, мне нужно будет сделать некоторые псевдонимы для конкретной ОС. ;) – ABach

+0

OS X является основанной на FreeBSD, и поэтому имеет версию xargs FreeBSD. Он совместим с POSIX, но не имеет расширений GNU. – rjh

0

Может быть, вы хотите использовать "-r" вариант xargs':

xargs -r -0 git rm --ignore-unmatch 

Таким образом, если ls-files ничего не показывает, xargs не будет называть git rm.

0

Существует «мерзавец чистый» (люди ГИТ-чистый): Удалить неотслеживаемые файлы из рабочего дерева

 Смежные вопросы

  • Нет связанных вопросов^_^