Перезавантажте git repo з новим .gitignore файлом


192

Чи можливо "оновити" сховище git після оновлення файлу gitignore?

Я просто додав ще більше ігнорування (?) До свого gitignore і хотів би видалити речі, які вже є у репо, що відповідають новому файлу.



Чи може це рішення видалити вже зафіксовані файли, що відповідають новому gitignore?
Крістіан Ваттенгор

100
+1 за вигадку слова "ігнорування".
Аасмунд Елдхусет

3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset це офіційно
Даніель Спрінгер

1
@ user770: Сьогодні я дізнався!
Асмунд Елдхусет

Відповіді:


371

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

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( переконайтеся, що спершу внесете зміни, які ви хочете зберегти , щоб уникнути будь-яких інцидентів, оскільки коментарі jball037 наведені нижче .
Ця --cachedопція дозволить зберегти ваші файли недоторканими на диску.)

У публікації в блозі " Зробити Git ігнорувати вже відстежувані файли " у вас є інші більш дрібні рішення :

git rm --cached `git ls-files -i --exclude-standard`

Bassim передбачає його редагування :

Файли з простором на їх шляху

Якщо ви отримаєте таке повідомлення про помилку fatal: path spec '...' did not match any files, на їх шляху можуть бути файли з пробілами.

Ви можете видалити всі інші файли за допомогою параметра --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

але незрівняні файли залишаться у вашому сховищі, і їх доведеться явно видалити, додавши їх шлях подвійними лапками:

git rm --cached "<path.to.remaining.file>"

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

3
Я щойно запустив це, втратив усі мої неспроможні зміни і майже оголосив про відставку з роботи. Прийнятий відповідь на цю тему врятував моє життя: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037

2
@VonC Вибачте, що це не мало бути рентом чи паличкою :) Але так, я використав - кеш і всі мої невмілі зміни змінилися, коли я перевірив свої файли. На хвилину запанікував, але "git reset HEAD" відновив мої файли (але цього разу без файлів, які я вказав у .gitignore, тому ваше рішення все-таки спрацювало!)
jball037

3
@ jball037 Добре. Я додав попередження і відповідним чином відредагував відповідь.
VonC

1
якщо я лише прочитаю ще один рядок, перш ніж робити це "(переконайтеся, що спершу внесіть зміни, які ви хочете зберегти, щоб уникнути будь-якого інциденту, як jball037" #fml
Aiden Strydom

9

Я можу неправильно зрозуміти, але ви намагаєтесь видалити файли, щойно проігноровані, або ви хочете ігнорувати нові зміни цих файлів? У цьому випадку справа справна.

Якщо ви хочете видалити ігноровані файли, які раніше були зроблені, скористайтеся

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

Що тут з одноцитатами?
ІгорГанапольський

Це чудова відповідь
Олен

Це дуже просто, чому видаляти файли після оновлення мого .gitignore Однак для цього потрібні кілька незначних оновлень: `` git rm - кешований git ls-files -i –exclude-standard git commit -m 'очищення ``
Aaron

1

Я знаю, що це старе питання, але рішення gracchus не працює, якщо імена файлів містять пробіли. Рішення VonC для імен файлів з пробілами полягає в тому, щоб не видаляти їх з використанням --ignore-unmatch, а потім видаляти їх вручну, але це не спрацює, якщо їх багато.

Ось рішення, яке використовує масиви bash для захоплення всіх файлів.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

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