将许多子目录分离到一个新的单独的git存储库中。

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (51)

我不想分离一个子目录,而是分离几个子目录。例如,我的当前目录树如下所示:

/apps
  /AAA
  /BBB
  /CCC
/libs
  /XXX
  /YYY
  /ZZZ

我希望这样做:

/apps
  /AAA
/libs
  /XXX

--subdirectory-filter争论git filter-branch因为它第一次运行时除去给定目录之外的所有内容,所以无法工作。

我以为--index-filter所有不想要的文件的参数都可以工作(虽然很乏味),但是如果我多次运行它,我会得到以下消息:

Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f

提问于
用户回答回答于

你为什么要运行filter-branch不止一次?你可以在一次扫描中完成这一切,所以不需要强迫它(注意,你需要extglob)在shell中启用此操作):

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 ...)是必要的。extglob由shell计算,而不是使用索引筛选器计算,该筛选器使用sh内建eval(在哪里extglob不可用)。

用户回答回答于

与其处理子shell并使用ext GLOB(正如Kynan所建议的那样),不如尝试这种简单得多的方法:

git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- apps/AAA libs/XXX' --prune-empty -- --all

扫码关注云+社区