Чи можливо "оновити" сховище git після оновлення файлу gitignore?
Я просто додав ще більше ігнорування (?) До свого gitignore і хотів би видалити речі, які вже є у репо, що відповідають новому файлу.
Чи можливо "оновити" сховище git після оновлення файлу gitignore?
Я просто додав ще більше ігнорування (?) До свого gitignore і хотів би видалити речі, які вже є у репо, що відповідають новому файлу.
Відповіді:
Рішення, згадане в " .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 rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'
git ls-files -i –exclude-standard
git commit -m 'очищення ``
Я знаю, що це старе питання, але рішення 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'