Видалення декількох файлів з репозиторію Git, які вже були видалені з диска

У мене є Git repo, що я видалив чотири файли за допомогою rm (НЕ git rm ), а мій статус Git виглядає наступним чином:

 # deleted: file1.txt # deleted: file2.txt # deleted: file3.txt # deleted: file4.txt 

Як видалити ці файли з Git без необхідності ручного переходу і додавання кожного файлу наступним чином:

 git rm file1 file2 file3 file4 

В ідеалі я шукаю щось, що працює так само, як git add . , якщо це можливо.

1246
29 янв. заданий Codebeef 29 Січня. 2009-01-29 20:18 '09 о 20:18 2009-01-29 20:18
@ 29 відповідей

Для Git 1.x

 $ git add -u 

Це означає, що Git автоматично виконує відстеження файлів, включаючи видалення раніше відстежених файлів.

Для Git 2.0

Щоб скомпонувати все дерево роботи:

 $ git add -u :/ 

Щоб виконати тільки поточний шлях:

 $ git add -u . 
+2232
10 сент. відповідь дан carl 10 верес. 2009-09-10 03:13 '09 в 3:13 2009-09-10 3:13
 git ls-files --deleted -z | xargs -0 git rm 
border=0

може бути те, що ви шукаєте .. це працює для мене ..

тисячу триста тридцять-дев'ять
28 февр. відповідь дан Varinder 28 февр. 2011-02-28 23:21 '11 о 23:21 2011-02-28 23:21

Ви можете використовувати

 git add -u 

Щоб додати видалені файли в проміжну область, потім скопіюйте їх

 git commit -m "Deleted files manually" 
726
29 янв. відповідь дан Cody Caughlan 29 Січня. 2009-01-29 20:25 '09 о 20:25 2009-01-29 20:25

Якщо ви просто запустіть:

 git add -u 

git оновить свій індекс, щоб знати, що файли, які ви видалили, фактично повинні бути частиною такого коммітов. Потім ви можете запустити "git commit", щоб перевірити цю зміну.

Або, якщо ви запустите:

 git commit -a 

Він автоматично прийме ці зміни (і будь-які інші) і зафіксує їх.

Оновлення. Якщо ви хочете тільки додати видалені файли, спробуйте:

 git ls-files --deleted -z | xargs -0 git rm git commit 
354
10 сент. відповідь дан Emil Sit 10 верес. 2009-09-10 03:15 '09 о 3:15 2009-09-10 3:15

Можливо, ви шукаєте -A:

 git add -A 

це схоже на git add -u, але також додає нові файли. Це приблизно еквівалентно команді hg addremove (хоча виявлення переміщення відбувається автоматично).

163
29 янв. відповідь дан Dustin 29 Січня. 2009-01-29 21:10 '09 о 21:10 2009-01-29 21:10

Щоб підготувати тільки віддалені файли:

 for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done 

Або (спосіб xargs):

 git status | awk '/deleted/ {print $2}' | xargs git rm 

Ви можете використовувати псевдонім пріоритетного набору команд для зручного подальшого використання.

92
26 нояб. відповідь дан Saeb Amini 26 нояб. 2011-11-26 13:34 '11 о 13:34 2011-11-26 13:34
 git rm test.txt 

До або після видалення фактичного файлу.

60
10 сент. відповідь дан Peaker 10 верес. 2009-09-10 03:13 '09 в 3:13 2009-09-10 3:13

Використовуючи git -add з параметрами '--all' або '--update', ви можете отримати більше, ніж ви хотіли. Нові та / або змінені файли також будуть додані в індекс. У мене є настройка bash alias, коли я хочу видалити видалені файли з git, не торкаючись інших файлів:

 alias grma='git ls-files --deleted -z | xargs -0 git rm' 

Всі файли, які були видалені з файлової системи, додаються в індекс як віддалені.

48
31 янв. відповідь дан zobie 31 Січня. 2009-01-31 07:50 '09 о 7:50 2009-01-31 7:50

Не те, щоб це дійсно мало значення, але я не згоден з обраним відповіддю:

 git add -u 

... видалить файли з індексу, якщо відповідні файли в робочому дереві були видалені, але також буде піддано модифікованому оновленого змісту відслідковуються файлів.

 git rm $(git ls-files --deleted) 

... з іншого боку буде тільки rm віддалених файлів, які були відслідковані.

Так що останнє, на мій погляд, найкращий варіант.

38
09 апр. відповідь дан Stephan Tual 09 Квітня. 2012-04-09 14:24 '12 о 14:24 2012-04-09 14:24

Якщо це єдині зміни, ви можете просто зробити

 git commit -a 

щоб зафіксувати всі зміни. Це буде включати видалені файли.

28
29 янв. відповідь дан SpoonMeiser 29 Січня. 2009-01-29 20:29 '09 о 20:29 2009-01-29 20:29
 git ls-files --deleted | xargs git rm 

- кращий варіант для додавання тільки віддалених файлів.

Ось деякі інші варіанти.

 git add . => Add all (tracked and modified)/new files in the working tree. git add -u => Add all modified/removed files which are tracked. git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree. git commit -a -m "commit message" - Add and commit modified/removed files which are tracked. 
19
01 окт. відповідь дан Sijo Kurian 01 Жовтня. 2012-10-01 22:36 '12 о 22:36 2012-10-01 22:36

git add -u

-u --Обновіть Тільки збіг з уже відстежувати файлами в індексі, а не з робочим деревом. Це означає, що він ніколи не буде створювати нові файли, але буде змінений новий контент відслідковуються файлів і що він видалить файли з індексу, якщо відповідні файли в робочому дереві були видалені.

Якщо немає, за замовчуванням використовується значення "."; іншими словами, оновити всі відслідковують файли в поточному каталозі і його підкаталогах.

15
26 авг. відповідь дан Obay 26 Серпня. 2014-08-26 15:24 '14 о 15:24 2014-08-26 15:24

Це просте рішення відмінно підходить для мене:

 git rm $(git ls-files --deleted) 
14
06 нояб. відповідь дан Husam Bdr 06 нояб. 2015-11-06 16:32 '15 о 16:32 2015-11-06 16:32

Якщо ви хочете додати його в свій .gitconfig , виконайте наступні дії:

 [alias] rma = !git ls-files --deleted -z | xargs -0 git rm 

Потім все, що вам потрібно зробити, запускається:

 git rma 
10
25 июля '12 в 23:47 2012-07-25 23:47 відповідь дан Evan Moran 25 липня '12 о 23:47 2012-07-25 23:47
 git ls-files --deleted -z | xargs -0 git rm --cached 

Це призведе до видалення всіх видалених файлів, які раніше відстежувалися за допомогою git, а також обробляти випадок, коли в ваших іменах є прогалини.

Залежно від вашого варіанта POSIX вам може знадобитися використовувати xargs -0 -r : це призведе до того, що xargs буде витончено вийти при нульовому контенті.

EDIT: прапори --cached і --deleted використовуються в тандемі для захисту від випадкового видалення файлів, які ще не були видалені.

8
04 янв. відповідь дан Murphy Danger 04 Січня. 2014-01-04 23:34 '14 о 23:34 2014-01-04 23:34

Спробуйте.

 -a --all Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected. git add .  git commit -m -a "Your commit" have been modified and deleted -a --all Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected. git add .  git commit -m -a "Your commit" about are not affected -a --all Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected. git add .  git commit -m -a "Your commit" 

або

 git add --all  git commit -m "Your commit" 
6
09 марта '15 в 18:05 2015-03-09 18:05 відповідь дан ilgam 09 березня '15 о 18:05 2015-03-09 18:05

Будь ласка, використовуйте -t , щоб побачити, яка команда насправді запущена

Я тільки що змінив відповідь Вірдера, щоб зробити те ж саме:

 git ls-files --deleted -z | xargs -t -0 git rm 
6
17 апр. відповідь дан Venkateswara Rao 17 Квітня. 2016-04-17 18:00 '16 о 18:00 2016-04-17 18:00

Наступне буде працювати, навіть якщо у вас є багато файлів для обробки:

 git ls-files --deleted | xargs git rm 

Ви, ймовірно, також захочете залишити коментар.

Подробиці дивіться в: Корисні скрипти Git

5
24 мая '13 в 16:45 2013-05-24 16:45 відповідь дан l3x 24 травня '13 о 16:45 2013-05-24 16:45

Жоден з прапорів в git -add НЕ буде видаляти тільки віддалені файли; якщо все, що ви змінили, - це віддалені файли, то ви в порядку, але в іншому випадку вам потрібно запустити git -status і проаналізувати висновок.

Відпрацювання відповіді Джеремі, ось що я отримав:

 git status | sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm 
  • Отримати статус файлів.
  • Для віддалених файлів виділіть ім'я файлу.
  • Видаліть всі рядки, що починаються С #, а також рядок стану, в якій є слово "deleted"; Я не пам'ятаю, що це було, точно, і цього більше немає, тому вам може знадобитися змінити це для різних ситуацій. Я думаю, що угруповання виразів може бути специфічною для GNU, тому, якщо ви не використовуєте gnutils, вам може знадобитися додати кілька рядків grep -v .
  • Передайте файли в git rm .

Вставити це в псевдонім оболонки ...

5
26 июля '09 в 2:41 2009-07-26 02:41 відповідь дан Xiong Chiamiov 26 липня '09 о 2:41 2009-07-26 2:41

як згадувалося

 git add -u 

видаляє видалені файли для видалення, АЛЕ ТАКОЖ модифіковані файли для оновлення.

Щоб відключити змінені файли, ви можете зробити

 git reset HEAD <path> 

якщо ви хочете, щоб ваші коммітов були організовані і чисті.
ПРИМІТКА: Це може також призвести до видалення віддалених файлів, тому будьте обережні з цими підстановочних знаками.

4
21 февр. відповідь дан DarkNeuron 21 февр. 2012-02-21 21:43 '12 о 21:43 2012-02-21 21:43
 git commit -m 'commit msg' $(git ls-files --deleted) 

Це спрацювало для мене після того, як я вже видалив файли.

4
05 авг. відповідь дан Chad 05 Серпня. 2014-08-05 17:40 '14 о 17:40 2014-08-05 17:40

Мені потрібно було те ж саме і використовувала кнопку git gui "changed changed". він також додає все.

І після "зміни стадії" я зробив "commit" ...

тому мій робочий каталог знову очищується.

3
15 нояб. відповідь дан Serdar 15 нояб. 2011-11-15 17:29 '11 о 17:29 2011-11-15 17:29

Ви можете використовувати git add -u <filenames> для розміщення тільки віддалених файлів.

Наприклад, якщо ви видалили файли templates/*.tpl , використовуйте git add -u templates/*.tpl .

-u потрібно для звернення до файлів, які існують в репозиторії, але більше не існує в робочому каталозі. В іншому випадку за замовчуванням git add буде шукати файли в робочому каталозі, і якщо ви вкажете файли, які ви там видалили, вони не знайдуть їх.

2
07 марта '13 в 4:29 2013-03-07 04:29 відповідь дан thomasrutter 07 березня '13 в 4:29 2013-03-07 4:29

(Ще одна зміна)

Я хотів видалити всі вже видалені з файлів диска, але з однією конкретною папки, залишивши інші папки недоторканими. Для мене працювали такі:

 git ls-files --deleted | grep <folder-name> | xargs git rm 
1
23 нояб. відповідь дан urban 23 нояб. 2016-11-23 13:32 '16 о 13:32 2016-11-23 13:32

щось на зразок

 git status | sed -s "s/^.*deleted: //" | xargs git rm 

може це зробити.

1
29 янв. відповідь дан Jeremy French 29 Січня. 2009-01-29 20:28 '09 о 20:28 2009-01-29 20:28

Додавання системного псевдоніма для розміщення віддалених файлів у вигляді команди rm-all

UNIX alias rm-all='git rm $(git ls-files --deleted)'

WINDOWS doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

Примітка

У Windows повинен бути встановлений bash .

1
19 февр. відповідь дан Haris Krajina 19 февр. 2014-02-19 15:16 '14 о 15:16 2014-02-19 15:16

Для проекту візуальної студії

 'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

який корисний, коли шлях віддаленого файлу має прогалину

0
04 февр. відповідь дан Sawyer 04 февр. 2014-02-04 18:34 '14 о 18:34 2014-02-04 18:34
 git rm $(git ls-files -d) 

Видаляє всі файли, перераховані командою git ls-files (-d показує тільки віддалені файли). Чи не працює для файлів з пробілами в імені файлу або шляху, але просто запам'ятати

0
10 дек. відповідь дан A. Albershteyn 10 дек. 2018-12-10 11:19 '18 о 11:19 2018-12-10 11:19

Найбільш гнучким рішенням, яке я знайшов на сьогоднішній день, є

 git cola 

І виберіть всі видалені файли, які я хочу виконати.

(Примітка. Зазвичай я роблю все командний рядок в git, але git обробляє видалені файли трохи незручно).

-1
03 окт. відповідь дан Broes De Cat 03 Жовтня. 2012-10-03 17:28 '12 о 17:28 2012-10-03 17:28

Інші питання по мітках або Задайте питання