Похоже, что большинство (все?) Ответов здесь полагаются на некоторую форму git filter-branch --subdirectory-filter
и тому подобное. Это может работать «чаще всего», однако в некоторых случаях, например, в случае, когда вы переименовали папку, например:
ABC/
/move_this_dir # did some work here, then renamed it to
ABC/
/move_this_dir_renamed
Если вы сделаете обычный стиль фильтра git для извлечения «move_me_renamed», вы потеряете история изменений файла, произошедшая со спины, когда она изначально была move_this_dir ( ref ).
Таким образом, кажется, что единственный способ действительно сохранить всю историю изменений (если у вас такой случай), это, по сути, скопировать репозиторий (создать новый репозиторий, установить его в быть источником), затем уничтожить все остальное и переименовать подкаталог в родительский файл следующим образом:
git branch -a
git checkout --track origin/branchABC
cp -r oldmultimod simple
cd simple
git rm otherModule1 other2 other3
git mv moduleSubdir1/* .
rmdir moduleSubdir1
git status
git remote set-url origin http://mygithost:8080/git/our-splitted-module-repo
git remote -v
git push
git checkout branch2
Это следует github doc "Разделение подпапки в новом хранилище" шаги 6-11, чтобы подтолкнуть модуль к новому репо.
Это не сэкономит вам места в папке .git, но сохранит всю историю изменений этих файлов даже при переименовании. И это может не стоить того, если не будет потеряно «много» истории и т. Д. Но, по крайней мере, вы гарантированно не потеряете старые коммиты!
Поскольку getMammals
может вернуть List
, и если он был преобразован в List
, то вы Мог бы добавить к нему Зебру
. Вам нельзя разрешить добавить Зебру
в список Жираф
, не так ли?
class Zebra extends Mammal { }
List<Giraffe> giraffes = new List<Giraffe>();
List<Mammal> mammals = giraffes; // not allowed
mammals.add(new Zebra()); // would add a Zebra to a list of Giraffes
К сожалению, это не так.
Когда вы объявляете getMammals () для возврата List extends Mammal>
это означает, что он может возвращать List
или List
, но не List
Ваш main () должен выглядеть вот так:
public static void main(String[] args) {
List<? extends Mammal> mammals = getMammals();
Mammal mammal = mammals.get(0);
}
РЕДАКТИРОВАТЬ: Что касается ковариации, то это обычно подразумевается под этим:
class Animal {
public Animal getAnimal() {return this;}
}
class Mammal extends Animal {
public Mammal getAnimal() {return this;}
}
class Giraffe extends Mammal {
public Giraffe getAnimal() {return this;}
}
Как вы можете видеть, это позволяет перегрузить методы возвращаемого типа при переопределении метода.