2016-03-23 3 views
0

Я начал использовать git cherrypick; и в результате я сейчас (очень часто) сталкиваюсь с ситуациями, которые дают мне много файлов, помеченных как «удаленные нами».Howto "git ls" файлы, отмеченные git как "удаленные нами"

Я видел this other question, это упомянуто, как использовать git ls-files --deleted, чтобы получить плоский список файлов; который затем может быть подключен к xargs rm.

Проблема: --deleted не перечисляет эти файлы «удалены нами».

Итак, длинный рассказ: какой самый простой/прямой способ удаления файлов «удалены нами»?

(мне очень понравилась мерзавца LS-файлы подход, поскольку это не требует СЭД/AWK магии, поэтому также не беспокоиться о получении котировки прямо ...)

Update; просто чтобы объяснить, почему это не какая-то ситуация с «XY проблемой»:

  • Фактически я использую git svn; для подключения к некоторым бэкенд SVN сервер
  • ствол SVN содержит каталоги A, B, C
  • Я внесение изменений на стволу, которые влияют на все три директории
  • Но: мерзавец, где я бегу вишнево-медиатор. .. действительно напоминает «ветви продукта», созданные на сервере SVN. Эти «товарные» ветви содержат только подмножества (поэтому есть A и B, а другие - B и C).
  • Я старался; но я действительно не смог создать клон git svn, содержащий одновременно ветви продукта SVN и SVN.
+0

что «удалено нами» на самом деле означает? –

+0

'git ls-files --deleted | xargs rm' ** не является ** безопасным для имен файлов, которые нуждаются в цитировании. Только для записи. Вам нужны 'git ls-files -z --deleted | xargs -0 rm' для этого. –

+0

Реальный вопрос: почему вы часто удаляете файлы в своей ветке, которые другие меняют на своих ветках? –

ответ

0

Я не знаю о «простой» команде, подобной этой, но вы можете использовать git status сам по себе.

while read -d '' status file; do 
    case "$status" in 
     (D?) 
      echo "Removing $file that was deleted by us." 
      #rm "./$file" 
      ;; 
    esac 
    #printf 'status: %q\nfilename: %q\n' "$status" "$file" 
done < <(git status -sz) 

Чтобы соответствовать только DU, а не D? (D односимвольный) изменить шаблон соответствующим образом.

Чтобы запустить rm использовать только один раз files+=("$file") в if блоке, а затем rm "${files[@]}" в конце.

+0

Не работает. Когда я запускаю команду, я получаю вывод как: 'filename:/some/real/file \ n Файл удален нами. \ N статус: DU' (\ n вставлен mself, чтобы указать разрыв строки). – GhostCat

+0

Как насчет этого не получилось? (Предполагая, что вы сообщили о выходе из строя.) Этот фрагмент должен просто выводить каждый файл с разницей и * также * выводить файл «Файл ... был удален нами» для каждого удалённого нами файла. –

+0

Дело в том, что он печатает «Файл удален нами». $ Filename кажется пустым. И я нашел хорошее решение тем временем; это достаточно хорошо для наборов файлов, которые мы используем 'git status --porcelain | grep "DU" | cut -d "" -f2 | xargs git rm' (на основе того факта, что статус git фактически обеспечивает разный вывод (D vs DU) при вызове с этой опцией) – GhostCat

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