Как удалить файлы .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, я хочу удалить файлы, которые уже присутствуют в моем хранилище, проверено git merge или другим разработчиком
maximus ツ
1
Я пропустил часть о проверенных файлах. Однако файлы .orig пишутся с помощью mergetool. Для меня это звучит как неочищенное разрешение конфликтов.
Зиу
Вам нужно полностью удалить файл из всей истории?
Linquize
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
TheChymera
источник
14
Если вы получили ошибку предиката, используйте: find. имя * .orig | xargs rm -f
Нейл
Как предупреждение, использование 'find -delete' может быть опасным. Пожалуйста, убедитесь, что каталог (в данном случае '.') Правильный, чтобы убедиться, что вы удаляете только то, что хотите удалить
kingledion
8
Это боль, которая git clean -dfэтого не делает. Почему мы должны вручную убирать мусор, который он оставляет?
Шридхар Сарнобат
А как насчет Windows?
Panzercrisis
3
@Panzercrisis, если вы используете Windows, у вас, вероятно, уже будет эмулятор терминала, через который вы взаимодействуете с Git. Я бы порекомендовал "gitforwindows", который содержит BASH со всеми другими обычно необходимыми инструментами.
TheChymera
151

Попробуйте git cleanбольше информации вы можете найти здесь или здесь

Амар
источник
1
Я могу очистить неотслеживаемые файлы, но как быть с удалением таких файлов, которые уже находятся в хранилище.
Максимум ツ
Вы должны сначала удалить файл из репозитория, 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 - вы бы так подумали, но когда вы выбираете код, вы видите в два раза больше результатов поиска, чем хотите (что дает ложное представление о том, что есть в вашем последнем коде). Это настолько редко, что я предпочел бы просто жить с опасностью отсутствия оригинальных файлов. Лучше просто регулярно совершать.
Шридхар Сарнобат
5

К сожалению git clean, не работает для меня, потому что я *.origдобавил в свой глобальный файл gitignore, поэтому они также игнорируются. Даже запуск git clean -xне годится, потому что я не хочу, чтобы все мои игнорируемые файлы были удалены. git clean -iполезно, но на самом деле я не хочу просматривать каждый файл.

Однако мы можем использовать шаблон исключения и отменить совпадение. Предварительный просмотр с этой командой:

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

Затем, когда вы уверены, передайте forceфлаг, чтобы действительно удалить их:

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

Основано на комментарии leorleor

Джефф Пукетт
источник
3

git rm Gemfile.lock.orig а остальные файлы вам не нужны. git commit --amend

Чтобы полностью удалить эти капли, git gc --prune=0 --aggressive

linquize
источник
@linquizebut commit из git rm Gemfile.lock.orig войдет в последний коммит с использованием поправки, верно? Есть ли другой способ не иметь коммит для такого файла?
Максимум ツ
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/
Ueffes
источник
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: пропустить, когда пусто), просто скопируйте и вставьте команды, дважды проверяя файлы для удаления.

fiorentinoing
источник
Хотя это может ответить на вопрос авторов, в нем отсутствуют некоторые поясняющие слова и / или ссылки на документацию. Фрагменты исходного кода не очень полезны без каких-либо фраз вокруг них. Вы также можете найти, как написать хороший ответ очень полезно. Пожалуйста, отредактируйте свой ответ.
привет
-4

git rm <file>

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

Также добавьте файлы / каталоги, которые вы хотите игнорировать, в свой файл .gitignore.

veritas1
источник
git rm <file> <file>Просто перечислите их.
veritas1
Затем вам нужно перечислить все файлы, или использовать инструмент, подобный find, чтобы передать их в git rm, или использовать глобус оболочки и перебирать их. Git не дублирует эту стандартную функциональность командной строки Unix.
Мабрахам
1
файлы orig не добавляются в репозиторий, поэтому нет необходимости использовать git rm, просто используйте rmвместо этого
Эдсон Медина