我有以下这个结构的单一存储库:
my-repo/
foo/
contents-of-foo
bar/
contents-of-bar
baz/
contents-of-baz
other-contents
我希望得到以下结构,理想情况下不会丢失任何历史记录/标签:
new-combined-repo/
contents-of-foo
bar/
contents-of-bar
baz/
contents-of-baz
和
my-other-repo
other-contents
我有点坚持如何继续。我试过这个:
$ pushd path/to/my-repo/
$ git mv bar foo/
$ git mv baz foo/
$ git commit -m "Move bar and baz prior to repository extraction"
$ cd ..
$ git clone --no-hardlinks my-repo new-combined-repo
$ pushd new-combined-repo
$ git remote rm origin
$ git filter-branch --tag-name-filter cat --subdirectory-filter foo \
--prune-empty -- --all
$ git log --follow foo/bar/some-file
在some-file
命令之前删除了git mv
的所有历史记录。
更好的建议? TIA。
答案 0 :(得分:1)
为什么不写一个树形过滤器(用于git filter-branch --tree-filter
)除去你要保留的所有目录?像这个(未经测试):
#!/bin/bash
shopt -s extglob dotglob
rm -r !(bar|baz|.gitignore)
这当然不会保留将移动到栏或baz中的文件的历史记录,但除了这种不常见的情况外,历史记录将保持不变。
答案 1 :(得分:1)
git filter-branch --tree-filter 'mv bar baz foo; rm *'
请先将rm *
混淆之前保存您的存储库副本。