Git отменить псевдоним с XARGS - PullRequest
0 голосов
/ 06 мая 2010

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

!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?

Ответы [ 4 ]

3 голосов
/ 06 мая 2010

С 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, чтобы также удалить полностью неотслеживаемые каталоги).

2 голосов
/ 06 мая 2010

со страницы руководства :

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

Убедитесь, что ваша версия xargs имеет эту опцию (man xargs)

0 голосов
/ 27 сентября 2011

Есть "git clean" (man git-clean): удаление неотслеживаемых файлов из рабочего дерева

0 голосов
/ 06 мая 2010

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

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

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

...