此问题基于Detach subdirectory into separate Git repository
我想要分离两个子目录,而不是分离单个子目录。例如,我的当前目录树如下所示:
/apps
/AAA
/BBB
/CCC
/libs
/XXX
/YYY
/ZZZ
我希望是这样的:
/apps
/AAA
/libs
/XXX
git filter-branch
的--subdirectory-filter
参数将不起作用,因为它在第一次运行时会删除除给定目录之外的所有内容。我认为对所有不需要的文件使用--index-filter
参数都可以(尽管很繁琐),但是如果我尝试多次运行它,我会得到以下消息:
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
有什么想法吗?提亚
发布于 2011-10-21 20:52:15
为什么要多次运行filter-branch
?您可以在一次扫描中完成所有操作,因此不需要强制执行(请注意,您需要在shell中启用extglob
才能正常工作):
git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch $(ls -xd apps/!(AAA) libs/!(XXX))" --prune-empty -- --all
这应该会消除不需要的子目录中的所有更改,并保留所有的分支和提交(除非它们只影响修剪子目录中的文件,由于--prune-empty
) -不会出现重复提交等问题。
执行此操作后,不需要的目录将被git status
列为未跟踪目录。
$(ls ...)
是必需的s.t.外壳程序而不是索引过滤器对extglob
求值,后者使用sh
内置的eval
(其中extglob
不可用)。有关这方面的更多详细信息,请参阅How do I enable shell options in git?。
发布于 2014-02-18 05:06:04
我已经写了一个git过滤器来解决这个问题。它有一个很棒的名字叫git_filter,位于github上:
https://github.com/slobobaby/git_filter
它是基于优秀的libgit2实现的。
我需要拆分一个包含多个提交(大约100000个)的大型存储库,而基于git filter-branch的解决方案需要几天时间才能运行。git_filter需要一分钟来做同样的事情。
发布于 2018-08-07 21:37:52
git clone git@example.com:thing.git
cd thing
git fetch
for originBranch in `git branch -r | grep -v master`; do
branch=${originBranch:7:${#originBranch}}
git checkout $branch
done
git checkout master
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- dir1 dir2 .gitignore' --prune-empty -- --all
git remote set-url origin git@example.com:newthing.git
git push --all
https://stackoverflow.com/questions/2982055
复制相似问题