Выдаленне некалькіх файлаў з рэпазітара 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 у 03:13 2009-09-10 03:13
 git ls-files --deleted -z | xargs -0 git rm 
border=0

можа быць тое, што вы шукаеце .. гэта працуе для мяне ..

1339
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 у 03:15 2009-09-10 03: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 у 03:13 2009-09-10 03: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 07: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 ў 02:41 2009-07-26 02: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 04: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

Іншыя пытанні па пазнаках або Задайце пытанне