git clone initial final
cd final
git filter-branch --tree-filter 'rm -rf <list of folders separated by space>' HEAD
Выше команды удалят любые папки, упомянутые в списке, но ваша исходная история фиксации будет сохранена.
git filter-branch -f --prune-empty
Затем можно использовать для удаления любых пустых коммитов, которые могут отображаться на вашем Список удаленных папок.
Альтернативно, если у вас есть большой репозиторий, который имеет значительно долгую историю, это может занять некоторое время. В этом случае вы можете использовать несколько иной подход -
Начните с создания отдельных репозиториев для каждой папки, которую вы хотите перенести. Это можно сделать с помощью команды filter-branch следующим образом
git filter-branch –prune-empty –subdirectory-filter A/ master
git filter-branch –prune-empty –subdirectory-filter B/ master
Каждый из них будет иметь содержимое соответствующих папок вместе со всей их историей. Затем вы можете использовать их как временные репозитории на удаленном компьютере. (они также будут действовать как контрольные точки в случае необходимости повторного выполнения процесса)
Затем создайте новый репозиторий
git clone <remote path> NewRepo
cd NewRepo
# add a readme file
touch Readme.md
git add .
git commit -am "Adding ReadMe file"
Затем вы можете объединить отдельные папки (A и B repos) в NewRepo
# Merge Repo A
git remote add -f A <remote path for A>
git merge -s ours --no-commit A/master
git read-tree --prefix=A/ -u A/master
git commit -m "Merge A into NewRepo"
git remote remove A
# Merge Repo B
git remote add -f B <remote path for B>
git merge -s ours --no-commit B/master
git read-tree --prefix=B/ -u B/master
git commit -m "Merge B into NewRepo"
git remote remove B
Затем вы можете подтвердить, что ваш источник настроен на то, чтобы указать на NewRepo и нажать код
git remote add origin <remote path for NewRepo>
git push origin master
NewRepo теперь должен содержать обе папки и вся их история.
И снова кажется, что я ответил на свой вопрос, проявив нетерпение и задав его в #clojure на Freenode. На Stackoverflow.com рекомендуется отвечать на свои вопросы: D
Я быстро поговорил с Ричем Хики, и вот его суть.
[12:21] <Raynes> Vectors aren't seqs, right?
[12:21] <rhickey> Raynes: no, but they are sequential
[12:21] <rhickey> ,(sequential? [1 2 3])
[12:21] <clojurebot> true
[12:22] <Raynes> When would you want to use a list over a vector?
[12:22] <rhickey> when generating code, when generating back-to-front
[12:23] <rhickey> not too often in Clojure
If you've done Java programming a lot, and are familiar with the Java collection framework, think of lists like LinkedList
, and vectors like ArrayList
. So you can pretty much choose containers the same way.
For further clarification: if you intend to add items individually to the front or the back of the sequence a lot, a linked list is much better than a vector, because the items don't need to be shuffled around each time. However, if you want to get at specific elements (not near the front or back of the list) frequently (i.e., random access), you will want to use vector.
By the way, vectors can easily be turned into seqs.
user=> (def v (vector 1 2 3))
#'user/v
user=> v
[1 2 3]
user=> (seq v)
(1 2 3)
user=> (rseq v)
(3 2 1)
просто небольшое примечание:
"I read that Vectors are not seqs, but Lists are."
последовательности более универсальны, чем списки или векторы (или карты или наборы).
К сожалению, REPL печатает списки и последовательности одинаково , потому что это действительно делает вид, будто списки являются последовательностями, даже если они разные. функция (seq) будет создавать последовательность из множества разных вещей, включая списки, и затем вы можете передать эту последовательность любой из множества функций, которые делают изящные вещи с помощью seqs.
user> (class (list 1 2 3))
clojure.lang.PersistentList
user> (class (seq (list 1 2 3)))
clojure.lang.PersistentList
user> (class (seq [1 2 3]))
clojure.lang.PersistentVector$ChunkedSeq
Sec имеет ярлык, который возвращает свой аргумент если это уже последовательность:
user> (let [alist (list 1 2 3)] (identical? alist (seq alist)))
true
user> (identical? (list 1 2 3) (seq (list 1 2 3)))
false
static public ISeq seq(Object coll){
if(coll instanceof ASeq)
return (ASeq) coll;
else if(coll instanceof LazySeq)
return ((LazySeq) coll).seq();
else
return seqFrom(coll);
}
списки являются последовательностями, хотя и другие вещи тоже, и не все последовательности являются списками.
Векторы имеют время произвольного доступа O (1), но они должны быть заранее выделены. Списки можно расширять динамически, но доступ к случайному элементу составляет O (n).