Як видалити кілька видалених файлів у сховищі Git


236

Я видалив декілька файлів і показує статус git, як показано нижче.

Я здійснив і підштовхнув.

GitHub все ще показує видалені файли у сховищі. Як я можу видалити файли у сховищі GitHub?

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    modules/welcome/language/english/kaimonokago_lang.php
#   deleted:    modules/welcome/language/french/kaimonokago_lang.php
#   deleted:    modules/welcome/language/german/kaimonokago_lang.php
#   deleted:    modules/welcome/language/norwegian/kaimonokago_lang.php

Якщо я використовую git rm, він дає наступне.

usage: git rm [options] [--] <file>...

-n, --dry-run         dry run
-q, --quiet           do not list removed files
--cached              only remove from the index
-f, --force           override the up-to-date check
-r                    allow recursive removal
--ignore-unmatch      exit with a zero status even if nothing matched


Відповіді:


637
git add -u 

оновлює всі ваші зміни


31
Працює шарм. Коли ви бачите щось на кшталт "git status | sed -n '/ ^ # * видалено: / s /// p' | xargs git rm" як запропоноване рішення для такої простої, але частої вимоги, тоді ви знаєте, що краще рішення - або скоро буде, за кутом.
arcseldon

Простіше, краще, це справді зручно, а потім "баш"
Castiel

1
Автор запитує, як видалити файли, чому додавання файлів є правильною відповіддю?
келін

3
@kelin: від git docs ( git-scm.com/docs/git-add ): "-u - update оновити індекс саме там, де вже є запис, що відповідає <pathspec>. Це видаляє, а також змінює записи індексу на відповідати робочому дереву, але не додає нових файлів. Якщо при використанні параметра -u не вказано <pathspec>, усі відстежувані файли у всьому робочому дереві оновлюються (старі версії Git використовуються для обмеження оновлення до поточного каталогу та її підкаталоги). "
HEDMON

92

Будьте дуже обережні git rm .; це може видалити більше, ніж ви хочете. Звичайно, ви можете видужати, але простіше цього не робити.

Найпростішим було б:

git rm modules/welcome/language/english/kaimonokago_lang.php \
       modules/welcome/language/french/kaimonokago_lang.php \
       modules/welcome/language/german/kaimonokago_lang.php \
       modules/welcome/language/norwegian/kaimonokago_lang.php

Ви не можете використовувати подстановочні символи оболонок, оскільки файли не існують, але ви можете використовувати (принаймні в Bash):

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php

Або врахуйте:

git status | sed -n '/^# *deleted:/s///p' | xargs git rm

Це займає висновок git status, не друкує нічого за замовчуванням ( sed -n), але на лініях, які починаються # deleted:, він позбавляється від #та deleted:та друкує те, що залишилося; xargsзбирає аргументи і передає їх git rmкоманді. Це працює для будь-якої кількості файлів незалежно від подібності (або несхожості) в іменах.


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

109
git diff --diff-filter=D --name-only -z | xargs -0 git rmє більш надійним підходом, ніж спроба розбору git status, орієнтованого на користувачів і не гарантованого стабільності в майбутніх версіях.
CB Bailey

@Charles: це, безумовно, краще, але це вимагає досить багато знань про те, які варіанти є в наявності git diff(чого я не мав, не маючи потреби раніше). Дякую!
Джонатан Леффлер

8
Зауважте, що є також "git ls-files --deleted"
Петро Гладких

1
значить, git ls-files --deleted | xargs git rmзробив для мене трюк.
fiacobelli

50

Ще одна версія відповіді ByScripts:

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

Це ТИЛЬКО видалить видалені файли з git.

Він також може бути використаний для додавання ТІЛЬКО модифікованих файлів.

git add $(git ls-files --modified)

Ці команди також працюють на gitbash для windows.


2
Безцінно, git ls-filesнастільки корисний статус із видаленим або зміненим статусом.
Маріо Пешев

1
Поведінка 'git add --update (or -u)'без аргументу шляху з підкаталогу дерева зміниться в Git 2.0 і більше не повинна використовуватися. Щоб додати вміст для всього дерева, запустіть: git add --update :/ (або git add -u: /) Щоб обмежити команду поточним каталогом, запустіть: git add --update . (або git add -u.) У поточній версії Git команда обмежена на Поточний каталог
Відповідь

1
Будь-яка ідея, як обробити доріжки з пробілами в них? Приклад: src/my spaced directory/myfile. Це може бути вирішено індивідуально, але як це можна впоратися за допомогою команд у цій відповіді?
Мухаммед Гелбана

35

Оновіть усі внесені вами зміни:

git add -u

Видалені файли повинні змінюватися від нестандартних (зазвичай червоного кольору) до поетапних (зелених). Потім зобов’язуйтеся видалити видалені файли:

git commit -m "note"

1
Заслуговує на популістський знак.
Іван

1
Це, безумовно, найкраще рішення. Жодних хакерських сценаріїв, жодних тривалих процесів, лише прапор, щоб сказати git ретельно оновити свій індекс.
Рон Далгрен

Блискуче! Врятувало мене від необхідності вводити 20+ шляхів до файлів. Дякую!
allardbrain

12

Найкраще рішення, якщо вам не байдуже інсценізувати модифіковані файли, - це використовувати, git add -uяк сказали mshameers та / або pb2q .

Якщо ви просто хочете видалити видалені файли, але не встановлювати жодних модифікованих, я думаю, вам слід використовувати ls-filesаргумент з --deletedопцією (не потрібно використовувати регулярний вираз або інші складні аргументи / параметри):

git ls-files --deleted | xargs git rm

1
git add -Aвирішує це питання ... про всяк випадок, коли хтось хоче знати це в майбутньому. перевірити нижченаведену відповідь
Ja8zyjits

8

Так, git rm <filename>буде встановлено видалений стан файлу, де <filename>міг би бути глобальний зразок:

$ git rm modules/welcome/language/*/kaimonokago_lang.php
rm modules/welcome/language/english/kaimonokago_lang.php
rm modules/welcome/language/french/kaimonokago_lang.php
rm modules/welcome/language/german/kaimonokago_lang.php
rm modules/welcome/language/norwegian/kaimonokago_lang.php

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    modules/welcome/language/english/kaimonokago_lang.php
#       ...

Тоді ви можете взяти на себе зобов’язання.

git commit -a зробимо це за один раз, якщо захочете.

Ви також можете застосувати git add -uвсі зміни, включаючи всі видалені файли, а потім виконати.


так rm. (повна зупинка) видалити їх відразу?
шинь

так що просто git rm видалить все відразу?
гомілка

1
Ви можете використовувати шаблон у глобальному стилі для видалення декількох файлів; Я оновив свою відповідь, щоб показати приклад.
Бен Джеймс

5
Здається git add -u, саме те, що ми шукаємо - якщо ви робите багато видалень, то хочете зробити всі видалення, що, як видається, є найпростішим і «стандартним» способом (мається на увазі без конкретних кнопок глобусів або складного розбору оболонки xargs). Чи є причина, яку ми не хотіли б використовувати цим, крім того, що вона додає всі зміни відразу?
trisweb

7

Коли у мене є багато видалених файлів, які не встановлені для фіксації, ви можете git rmїх усі в одному шоу за допомогою:

for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done

Як згадував питання відповіді, будьте обережні git rm.


5

Спробуйте це:

 git rm `git ls-files -d`

Це вирішило мою проблему постановки лише видалених сценаріїв (за допомогою bash)
Mariano Argañaraz

3

Можна використовувати

git commit -m "remove files" -a
git push

Після видалення файлів вручну.


1
Або однаково, але більш лаконічно: git commit -am "видалити файли"
BradChesney79

3

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

git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh

Створений сценарій є remove.shі містить повний список git rmкоманд.




2

Якщо ви хочете видалити їх усі, скориставшись "git rm". Це те, що я роблю:

git ls-files --deleted -z | xargs -0 git rm

Цей запит містить список усіх видалених файлів та видаляє їх із вашого сховища git. Сподіваюся, це допомагає.



1

У мене цей випуск файлів-привидів з'явився у моїй репо, після того як я видалив їх і натрапив на цю акуратну команду!

git add -A

Це по суті те саме, що git add -aі в git add -uпоєднанні, але це чутливе до регістру. Я отримав це з цього дивовижного посилання (це посилання вказує на версію на archive.org зараз, оскільки оригінал перейшов на сторінку спаму / фішингу станом на червень 2016 року)


0

Ось як виявити видалені файли та поетапно видалити їх як частину наступного комітету. Усі рішення цієї теми мають різні достоїнства. Це рішення нижче присвячено проблемі імен файлів з пробілами в них.

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'

переконайтеся, що ви протестуєте це за допомогою параметра --dry-run git, перш ніж запустити його, виконавши наступне:

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'

пояснення:

git status --porcelain

Це виводить щось на зразок D "/ шлях до папки / шлях до файлу", що відбувається лише тоді, коли в іменах шляху є пробіли

awk '/^.D .*$/ {print $0}'

відповідають лише рядкам, які починаються з "D"

sed 's/ D \(.*\)/\1/'

видаліть "D" з передньої частини кожного рядка

tr -d '"'

видаліть цитати, якщо такі є

xargs -I {} git rm '{}'

визначити змінні імені файлу як {} запустити ім'я файлу під git rm, укладеним в єдині лапки, щоб переконатися, що він підтримує імена файлів з пробілами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.