如何在保存子目录的同时拆分git存储库?

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

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

我希望将被分割为单独的repo的目录保留在该repo中的子目录中:

我有这个:

foo/
  .git/
  bar/
  baz/
  qux/

我想把它分成两个完全独立的存储库:

foo/
  .git/
  bar/
  baz/

quux/
  .git/
  qux/  # Note: still a subdirectory

怎么用git做这个?

如果有什么方法可以将所有新回购的内容转移到子目录中,那么在整个历史过程中都是如此。

提问于
用户回答回答于

确实可以使用子目录筛选器和索引筛选器将内容返回到子目录中,但如果只需要使用索引筛选器,那么为什么还要麻烦呢?

Here's an example from the man page:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

这只是移除一个文件名;您要做的是删除除给定子目录之外的所有内容。如果您想要谨慎,可以显式列出要删除的每一条路径,但是如果只想全部加入,可以这样做:

git filter-branch --index-filter 'git ls-tree -z --name-only --full-tree $GIT_COMMIT | grep -zv "^directory-to-keep$" | xargs -0 git rm --cached -r' -- --all

我希望有一个更优雅的方式,如果有人有什么东西,请建议它!

用户回答回答于

我也想做一件类似的事情,但是由于我想保存的文件列表很长,用无数的greps来做这件事是没有意义的。我编写了一个脚本,从文件中读取文件列表:

#!/bin/bash

# usage:
# git filter-branch --prune-empty --index-filter \
# 'this-script file-with-list-of-files-to-be-kept' -- --all

if [ -z $1 ]; then
    echo "Too few arguments."
    echo "Please specify an absolute path to the file"
    echo "which contains the list of files that should"
    echo "remain in the repository after filtering."
    exit 1
fi

# save a list of files present in the commit
# which is currently being modified.
git ls-tree -r --name-only --full-tree $GIT_COMMIT > files.txt

# delete all files that shouldn't be removed
while read string; do
    grep -v "$string" files.txt > files.txt.temp
    mv -f files.txt.temp files.txt
done < $1

# remove unwanted files (i.e. everything that remained in the list).
# warning: 'git rm' will exit with non-zero status if it gets
# an invalid (non-existent) filename OR if it gets no arguments.
# If something exits with non-zero status, filter-branch will abort.
# That's why we have to check carefully what is passed to git rm.
if [ "$(cat files.txt)" != "" ]; then
    cat files.txt | \
    # enclose filenames in "" in case they contain spaces
    sed -e 's/^/"/g' -e 's/$/"/g' | \
    xargs git rm --cached --quiet
fi

令人惊讶的是,这结果比我最初预期的要多得多,所以我决定把它发到这里。

扫码关注云+社区