Как удалить / удалить большой файл из истории коммитов в репозитории Git?

import java.util.HashMap;
import java.util.LinkedHashMap;

public class CountRepeatedWords {

    public static void main(String[] args) {
          countRepeatedWords("Note that the order of what you get out of keySet is arbitrary. If you need the words to be sorted by when they first appear in your input String, you should use a LinkedHashMap instead.");
    }

    public static void countRepeatedWords(String wordToFind) {
        String[] words = wordToFind.split(" ");
        HashMap<String, Integer> wordMap = new LinkedHashMap<String, Integer>();

        for (String word : words) {
            wordMap.put(word,
                (wordMap.get(word) == null ? 1 : (wordMap.get(word) + 1)));
        }

            System.out.println(wordMap);
    }

}
609
задан Whymarrh 16 April 2017 в 03:39
поделиться

2 ответа

Кроме git filter-branch (медленное но чистое решение мерзавца) и BFG (легче и очень производительный), существует также другой инструмент для фильтрации с хорошей производительностью:

https://github.com/xoofx/git-rocket-filter

Из его описания:

цель фильтра ракеты мерзавца подобна команде git-filter-branch при обеспечении следующих уникальных функций:

  • Быстрая перезапись фиксаций и деревьев (согласно порядку x10 к x100).
  • Встроенная поддержка обоих белых списков с - сохраняет (сохраняет файлы или каталоги), и помещающий в черный список с - удаляют опции.
  • Использование .gitignore как шаблон для фильтрации дерева
  • Быстрые и легкие Сценарии C# и для фильтрации фиксации и для дерева, фильтрующего
  • Поддержка сценариев в фильтрации дерева на шаблон файла/каталога
  • Автоматически, сокращают пустую/неизменную фиксацию, включая фиксации слияния
0
ответ дан 22 November 2019 в 21:49
поделиться

К сожалению, свойства средства проверки не отображаются как атрибуты, поэтому я не знаю, как выбрать их напрямую. Можно попытаться выполнить итерацию массива Page_Validators и отфильтровать массивы, с которыми требуется работать.

Try:

$.each(Page_Validators, function (index, validator){
   if (validator.validationGroup == "your group here"){

      ValidatorEnable(validator, false);

   }
});
-121--3266158-

Add Web Reference - это устаревшая технология ASP.NET webservices (ASMX) (использующая для своих вещей только GroupSerializer) - если вы это сделаете, вы получите клиент ASMX для веб-службы ASMX. Это можно сделать практически в любом проекте (Web App, Web Site, Console App, Winforms - вы его называете).

Добавить ссылку на услугу - это новый способ сделать это, добавив ссылку на услугу WCF, которая дает вам гораздо более совершенную, гораздо более гибкую модель услуги, чем просто простой старый материал ASMX.

Поскольку вы не готовы к переходу на WCF, вы также можете добавить веб-ссылку старого образца, если действительно необходимо: при выполнении «Add Service Reference» в появившемся диалоговом окне нажмите кнопку [Advanced] в левом углу кнопки:

alt text

и в следующем появившемся диалоговом окне нажмите кнопку [Add Web Reference] внизу.

-121--718741-

То, что вы хотите сделать, очень разрушительно, если вы опубликовали историю другим разработчикам. Для получения информации о необходимых шагах после восстановления истории см. раздел «Восстановление после ребазы в восходящем направлении» в документации по git rebase .

У вас есть по крайней мере два варианта: git filter-branch и интерактивная ребаза, которые объясняются ниже.

С помощью git filter-branch

у меня была аналогичная проблема с объемными двоичными тестовыми данными из импорта Subversion и я написал об удалении данных из репозитория git .

Скажем, ваша история гит:

$ git lola --name-status
* f772d66 (HEAD, master) Login page
| A     login.html
* cb14efd Remove DVD-rip
| D     oops.iso
* ce36c98 Careless
| A     oops.iso
| A     other.html
* 5af4522 Admin page
| A     admin.html
* e738b63 Index
  A     index.html

Обратите внимание, что гит лола является нестандартным, но очень полезным псевдонимом. С помощью переключателя --name-status можно увидеть изменения дерева, связанные с каждой фиксацией.

В записи «Неосторожный» (SHA1 имя объекта ce36c98) файл oops.iso представляет собой DVD-диск, добавленный случайно и удаленный в следующей записи, cb14efd. Используя метод, описанный в вышеупомянутом блоге, команда для выполнения:

git filter-branch --prune-empty -d /dev/shm/scratch \
  --index-filter "git rm --cached -f --ignore-unmatch oops.iso" \
  --tag-name-filter cat -- --all

Options:

  • --prune-empty удаляет фиксацию, которая становится пустой ( т. е. , не изменяйте дерево) в результате операции фильтрации. В типичном случае эта опция создает историю очистки.
  • -d называет временный каталог, который еще не существует для создания отфильтрованной истории. Если вы работаете в современном дистрибутиве Linux, указание дерева в /dev/shm приведет к более быстрому выполнению .
  • --индекс-фильтр является основным событием и выполняется по индексу на каждом шаге истории. Вы хотите удалить oops.iso везде, где он найден, но он присутствует не во всех фиксациях. Команда git rm --cached -f --ignore-unmatch oops.iso удаляет DVD-разрываться, когда он присутствует и не выходит из строя в противном случае.
  • --tag-name-filter описывает, как переписывать имена тэгов. Фильтром cat является операция идентификации. Ваш репозиторий, как и образец выше, может не иметь тэгов, но я включил этот вариант для полной общности.
  • -- указывает конец параметров git filter-branch
  • -all после -- является кратким для всех ссылок. Ваш репозиторий, как и образец выше, может иметь только одну ссылку (master), но я включил этот вариант для полной общности.

После некоторых сбросов, история теперь:

$ git lola --name-status
* 8e0a11c (HEAD, master) Login page
| A     login.html
* e45ac59 Careless
| A     other.html
| * f772d66 (refs/original/refs/heads/master) Login page
| | A   login.html
| * cb14efd Remove DVD-rip
| | D   oops.iso
| * ce36c98 Careless
|/
|   A   oops.iso
|   A   other.html
* 5af4522 Admin page
| A     admin.html
* e738b63 Index
  A     index.html

Обратите внимание, что новый «неосторожный» commit добавляет только other.html и что «удалить DVD-rip» commit больше не находится в главной ветви. Ветвь с меткой refs/original/refs/heads/master содержит исходные фиксаторы в случае ошибки. Чтобы удалить репозиторий, выполните действия, описанные в разделе «Контрольный список для сокращения репозитория»

$ git update-ref -d refs/original/refs/heads/master
$ git reflog expire --expire=now --all
$ git gc --prune=now

Для более простой альтернативы клонируйте репозиторий, чтобы удалить нежелательные биты.

$ cd ~/src
$ mv repo repo.old
$ git clone file:///home/user/src/repo.old repo

Использование файла :///... Клон URL копирует объекты, а не создает только жесткие ссылки.

Ваша история такова:

$ git lola --name-status
* 8e0a11c (HEAD, master) Login page
| A     login.html
* e45ac59 Careless
| A     other.html
* 5af4522 Admin page
| A     admin.html
* e738b63 Index
  A     index.html

Имена SHA1 объектов для первых двух фиксаций («Index» и «Admin page») остались прежними, поскольку операция фильтрации не изменила эти фиксации. «Неосторожный» потерял oops.iso и «Login page» получил нового родителя, поэтому их SHA1s изменился .

Интерактивная ребаза

С историей:

$ git lola --name-status
* f772d66 (HEAD, master) Login page
| A     login.html
* cb14efd Remove DVD-rip
| D     oops.iso
* ce36c98 Careless
| A     oops.iso
| A     other.html
* 5af4522 Admin page
| A     admin.html
* e738b63 Index
  A     index.html

вы хотите удалить oops.iso из «Беспечной», как если бы вы никогда не добавили его, а затем «Удалить DVD-rip» бесполезно для вас. Таким образом, наш план перехода к интерактивной ребазе состоит в том, чтобы сохранить «Admin page», изменить «Беспечно» и отменить «Remove DVD-rip».

Запуск $ git rebase -i 5af4522 запускает редактор со следующим содержимым.

pick ce36c98 Careless
pick cb14efd Remove DVD-rip
pick f772d66 Login page

# Rebase 5af4522..f772d66 onto 5af4522
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Выполняя наш план, мы изменяем его на

edit ce36c98 Careless
pick f772d66 Login page

# Rebase 5af4522..f772d66 onto 5af4522
# ...

То есть мы удаляем строку с «Remove DVD-rip» и меняем операцию на «Неосторожный» на edit , а не pick .

Выход из редактора вызывает нас в командной строке со следующим сообщением.

Stopped at ce36c98... Careless
You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

Как говорится в сообщении, мы находимся на «неосторожном» обязательстве, которое мы хотим отредактировать, поэтому мы выполняем две команды.

$ git rm --cached oops.iso
$ git commit --amend -C HEAD
$ git rebase --continue

Первый удаляет файл-нарушитель из индекса. Второй изменяет или изменяет значение «Неосторожный» в качестве обновленного индекса, а -C HEAD предписывает git повторно использовать старое сообщение фиксации. Наконец, git rebase --продолжение продолжается до конца операции rebase.

Это дает историю:

$ git lola --name-status
* 93174be (HEAD, master) Login page
| A     login.html
* a570198 Careless
| A     other.html
* 5af4522 Admin page
| A     admin.html
* e738b63 Index
  A     index.html

что вы хотите.

534
ответ дан 22 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: