如何在不指定每个分支的情况下将 git 存储库的所有分支克隆到它们自己的文件夹中?

How do you clone all branches of a git repository into their own folders, without specifying every branch?

我正在尝试制作一个脚本来自动将 this repo 及其所有分支拉入它们自己的文件夹或一个大文件夹中。除了手动克隆所有 48 个分支,然后将它们的所有文件复制到一个文件夹中,我找不到其他方法来执行此操作,但是,这将花费相当长的时间并且对每次更新都进行操作是不切实际的。有没有办法将所有这些分支克隆到它们自己的文件夹中,而无需指定每个分支?

喜欢....同时检查单个工作树中的所有分支?不是我所知道的......至少不是他们都在同一时间检查过。如果所有分支在它们包含的 directories/files 方面具有不同的结构,您可以这样做:

git branch | while read branch; do
    git checkout $branch -- .
done

但这并不是正式让每个分支都被“签出”......只是你要求将所有分支的内容放在工作树上。索引将充满要提交的文件.....如果你问我,你在玩火。

现在,如果它们可以保存在自己的工作树中,您可能会这样做:

git branch | while read branch; do
    git worktree add $branch $branch
done

这将为每个分支创建一个单独的工作树

如果我理解你的问题,你想克隆每个分支并在单独的文件夹中跟踪它们。

这里有一个 hacky bash 脚本可以做到这一点。每个分支都在自己的文件夹中克隆和跟踪。

remote="https://github.com/rtlewis88/rtl88-Themes.git"
branches=( $( git ls-remote --heads $remote | cut -f2) )
for branch in "${branches[@]}"
do
  bname=$( echo "$branch" | rev | cut -d/ -f1 | rev)
  mkdir $bname
  cd $bname
  git init
  git remote add -t $bname -f origin $remote
  git checkout $bname
  cd ..
done

您可以使用 git worktree (https://git-scm.com/docs/git-worktree) 将分支签出到单独的目录。

您可以通过使用 git for-each-ref (https://git-scm.com/docs/git-for-each-ref) 编写脚本来自动处理所有分支。

脚本可能会稍微复杂一些,因为默认情况下您有一个工作树并且它有一个分支已签出。 (我考虑过使用 bare 存储库来避免这种情况,但是 git 对 bare 存储库的使用方式做出了不同的假设,因此有些事情不会按照您的方式设置d 默认需要它们。)为避免出现问题,您应该将默认工作树置于分离 HEAD 状态。

mkdir my-tfs-style-repo
cd my-tfs-style-repo
got clone url/to/remote/repo
cd repo
git checkout --detach
git for-each-ref refs/remotes/origin --format='../%(refname:lstrip=3) %(refname:lstrip=3)'|grep -v ' HEAD$' |xargs -n 2 git worktree add

对于原始仓库中的每个分支(其名称为 <branchname>,这将创建一个目录 my-tfs-style-repo/<branchname>,并检出该分支。


ps - 这确实不是 git 预期的工作流程,事实上根据对您问题的评论,听起来回购确实没有按照他们的方式做事应该在 git.

内完成

因此,即使使用这样的解决方案,更新也不会那么容易接收。您必须遍历每个工作树并告诉它从相应的分支中提取更新。并非不可能 - 甚至可以编写脚本 - 而是潜在问题的症状。

应该怎样?好吧,我需要更多地了解他们在做什么。 听起来这些分支中的每一个都应该是一个回购协议,并且它们应该以某种方式组合在一起(也许是 git 子模块,也许是一个构建过程,将每个分支都视为一个单独包装)。