Як видалити файли .orig після об'єднання з сховища git?


160

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

    modified:   Gemfile.lock.orig
    #   modified:   Gemfile.orig
    #   modified:   app/assets/images/bg_required.png.orig
    #   modified:   app/assets/javascripts/application.js.orig

    etc...

Будь-яка допомога буде вдячна.


Можливий дублікат stackoverflow.com/questions/61212/…
ziu

@ziu, я хочу видалити файли, які вже є у моєму сховищі, зареєстровані за допомогою git merge або іншим розробником
maximus ツ

1
Я пропустив частину про зареєстровані файли. Однак, .orig файли записує mergetool. Мені це звучить як нечисте вирішення конфлікту.
ziu

Чи потрібно повністю видалити файл із усієї історії?
зв’язуйте

1
перевірити це stackoverflow.com/questions/872565/…
ziu

Відповіді:


253

Найкраще рішення в цьому випадку - це просто і позбутися цих файлів незалежно від git:

cd /your/repo/directory
find . -name '*.orig' -delete 

Крім того, у Windows / PowerShell можна виконати таку команду

cd \your\repo\directory
Get-ChildItem -Recurse -Filter '*.orig' | Remove-Item

14
Якщо ви отримуєте помилку предиката: знайдіть. -ім'я '* .orig' | xargs rm -f
Ніл

Так само, як попередження, використання "find -delete" може бути небезпечним. Перевірте правильність каталогу (у цьому випадку '.'), Щоб переконатися, що ви видаляєте лише те, що хочете видалити
kingledion

8
Це біль, яка git clean -dfцього не робить. Чому ми повинні вручну прибирати сміття, яке воно залишає після себе?
Шрідхар Сарнобат

Що з Windows?
Панцеркризис

3
@Panzercrisis, якщо ви використовуєте Windows, ви, ймовірно, вже буде мати емулятор терміналу, через який ви взаємодієте з Git. Я б порекомендував "gitforwindows", який містить BASH з усіма іншими необхідними інструментами.
TheChimera

151

Спробуйте git cleanбільше інформації, яку ви можете знайти тут або тут


1
Я можу прибрати непотрібні файли, але що робити з видаленням таких файлів, які вже є у сховищі.
maximus ツ

спочатку потрібно видалити файл із сховища, git rm <filename>а потім здійснити. Після цього додайте * .orig файл у git ignore.
Амар

4
Я думаю, що це краще рішення, ніж відповідь, позначене як відповідь.
Оргмір

51
git clean -iдійсно приємно. він надасть вам список файлів, які буде видалено, і дасть вам параметри, як поводитися зі списком (фільтруйте список, маючи змогу видалити все зі списку, та деякі інші параметри).
PPPaul

1
Ви можете використовувати git clean з візерунками, щоб допомогти видалити лише файли * .orig файлів: git clean -f -e '*.*' -e '!*.orig' Існує лише шаблон виключення, але він має невелику підтримку негативних шаблонів. Таким чином, ми можемо виключити всі файли *.*, а потім заперечити виключення лише *.origфайлів.
leorleor


6

Ви можете ігнорувати файли, використовуючи .gitignore

Просто поставте * .orig у список, як показано тут

https://help.github.com/articles/ignoring-files

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

for file in `find *.orig -type f -print`
do
   echo "Deleting file $file"
   git rm $file -f       
done

5
Хоча він, безумовно, може це зробити, тут робити це не правильно :)
Серхіо Туленцев

1
Я думаю, що це гарна ідея, оскільки вона зберігає резервну копію, але не заважає інсценованим файлам
akazemis

@akazemis - ви б так подумали, але коли ви шукаєте код, ви бачите вдвічі більше результатів пошуку, ніж ви хочете (що дає помилкове уявлення про те, що є в вашому останньому коді). Це так рідко, що я краще просто живу з небезпекою відсутності файлів orig. Краще просто здійснювати регулярні зобов’язання.
Шрідхар Сарнобат

5

На жаль git clean, не працює для мене, тому що я *.origдодав до свого глобального файлу gitignore, тому вони також ігноруються з чистого. Навіть запуск git clean -xне є корисним, оскільки я не хочу видаляти всі свої ігноровані файли. git clean -iкорисно, але насправді мені не хочеться переглядати кожен файл.

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

git clean -e '!*.orig' --dry-run

Потім, коли ви впевнені, передайте forceпрапор, щоб дійсно їх видалити:

git clean -e '!*.orig' -f

На основі коментаря леорлеора


3

git rm Gemfile.lock.orig а решта файлів, які вам не потрібні. git commit --amend

Щоб повністю видалити ці краплі, git gc --prune=0 --aggressive


@linquizebut фіксація git rm Gemfile.lock.orig піде в останню передачу, використовуючи поправки, правда? чи є якийсь інший спосіб не мати жодної комісії для такого файлу?
maximus ツ

2

Для мене git clean -fвидалено всі * .oig файли. І зберігає тих, що вже були там раніше.

Ось як це виглядало (майже) після злиття:

$ git status
On branch feature/xyz
Your branch is ahead of 'origin/feature/xyz' by 568 commits.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .idea/codeStyles/
    .idea/misc.xml.orig

.idea/codeStyles/був уже перед злиттям як файл без відстеження. .idea/misc.xml.orig(і набагато більше) довелося зняти.

=> Використання git clean -f:

$ git clean -f
Removing .idea/misc.xml.orig

в результаті:

$ git status
On branch feature/xyz
Your branch is ahead of 'origin/feature/xyz' by 568 commits.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .idea/codeStyles/

0

ви можете просто зробити git status -s | grep "\.orig$" | awk '{print $2}' | xargs -n1 -r echo rm

TL; DR;

git status -s дозволяє отримати всі модифіковані / відсутні файли відносно індексу

grep "\.orig$" фільтрувати файли, зберігаючи закінчення на ".orig"

awk '{print $2}' перелічує ім'я файлу (пропускаючи інформацію про git, наприклад, A, M, ??)

xargs -n1 -r echo rm друкує видалити команди на кожному аргументі (-n1: один за одним і -r: пропустити, коли порожній), просто скопіюйте та вставте команди, двічі перевіряючи наявність файлів для видалення.


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

-4

git rm <file>

http://git-scm.com/docs/git-rm

Також додайте у файл .gitignore файли / каталоги, які ви хочете проігнорувати.


git rm <file> <file>Просто перерахуйте їх.
veritas1

Потім вам потрібно перерахувати всі файли або скористатися таким інструментом, як знайти, щоб передати їх git rm, або скористатися глобулом оболонки та петлею над ними. Git не дублює цю стандартну функціональність командного рядка Unix.
мабрахам

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