Git - 每个分支都有独立的文件夹。设置方法

17

我需要在三个不同的文件夹中保留三个分支。(我知道这不是Git的做法。但出于某个原因,我需要这样做)。

假设仓库名称为my_proj_repo.git, 我已经在本地系统中创建了一个名为prodv1的文件夹:

git clone url:/my_proj_repo.git

现在我进入了prodv1文件夹,并从服务器上复制了文件,然后:
git commit -am "initial import"
git push origin master

那就将文件推送到主分支了。 现在我在本地系统中创建了两个与上述类似的文件夹。

stagingv1
devv1

我希望创建两个本地和远程分支,分别命名为:
staging // this local branch points (push/pull) to staging remote branch
dev     // this local branch points ((push/pull) to dev remote branch

这两个分支应该在相应的文件夹中:

staging ==> stagingv1 folder
dev     ==> devv1 folder

我尝试了几件事情,但我想我把它搞砸了。 有人可以告诉我指令/步骤以便我设置好所有的东西吗?
我的操作是进入“stagingv1”文件夹并执行“git clone ”,但默认是“master”分支。我不确定如何在这里初始化“staging”分支。

4
这不符合“Git的做事方式”吗?不同的项目应该放在它们自己的分支中,或者放在一个新的代码库中。否则,在同一个分支上放置不同的项目会将其他项目的历史记录混杂在一起,使历史记录变得混乱。 - NoBugs
4个回答

23

自从 git 2.5 引入 git worktree 命令,您想要实现的目标变得更加简单(甚至可以说是微不足道)。

基本上,您的 git 存储库现在完全自由地检出了被称为“工作树”的分支数:

  • 0(一个bare仓库——大致仅包含存储库的.git目录中的内容)
  • 1(正常的存储库——代码位于工作树中,git目录位于.git下)
  • n > 1, 一个正常的存储库,其中添加了 n-1 个位于存储库之外任意路径的工作树(并且具有指向存储库的git目录的.git文件)

如果您的存储库已经包含了您的分支,您可以执行以下操作:

git worktree add <path to branch> <branch name>

或者,如果该分支尚未创建且您想要基于主分支进行分支:

git worktree add -b <new branch name> <path to branch> master

请注意,您不能在多个目录中同时检出一个分支。


15
我认为你可能需要在你的存储库中创建所有分支。
$ git branch <name_of_your_new_branch>

请创建所有文件夹,并在每个文件夹中克隆存储库,但要检出相应的分支。
每个文件夹应该/可以仅跟踪相应的分支。
Step 1 $ git branch [name_branch#1]

Step 2 $ git branch [name_branch#2]

Step 3 $ git branch [name_branch#3]

...

Step 4 $ git push --all
Step 5 md Folder #2
Step 6 $ git clone [URL]
Step 7 $ git checkout [name_branch]

@KevinRave 我写了这个步骤,你可能需要调整一下命令,但我认为思路已经在那里了。 - JudgeProphet
这已经过时了,@Cimbali的答案应该被接受。 - Filip Seman

1
上述场景在以下情况下都是有效的:
1. 微服务:例如 AWS Lambda 开发,一个或两个开发人员负责一个 Lambda,共有 70 个 Lambda。因此,有 70 个文件夹,包括测试和代码文件夹。如果是单体系统,您必须确保系统的所有部分通过零合并问题协同工作。但是在这里,除了一些全局配置和一些共享文件夹之外,每个 70 个文件夹都是独立的。
2. Monorepo:大公司使用 Monorepo 管理更大项目的所有子项目,包括移动应用程序、网站、后端和其他相关内容。
主分支可能具有全部或部分代码,如果每个分支仅跟踪其文件夹中的更改。
一种方法是首先为共享模块创建共享分支。然后,创建多个分支,每个分支从空文件夹开始。永远不要将您的分支与主分支合并,只需拉取共享分支,将其合并到本地分支并推送到远程分支即可。
因此,远程的每个分支都有共享模块和您的代码。

1
这是一个Bash脚本,用于将所有远程分支检出到单独的工作树中,并保持同步。每次运行时,它都会丢弃任何本地更改。它只是尝试使检出的代码镜像仓库。
git fetch --all --prune

# reset branch only if it has deviated from the remote
function update_branch {
        if git diff --exit-code --quiet $1; then
                echo "No changes on branch $1"
        else
                echo "Resetting branch $1"
                git reset --hard $1
        fi
}

# master branch is checked out in the root
update_branch origin/master

# check out each remote branch into a subfolder
branches=$(git for-each-ref --format='%(refname:short)' refs/remotes/origin | grep -v /HEAD | grep -v /master)
for branch in $branches; do
        if [ -d $branch ]; then
                cd $branch
                update_branch $branch
                cd $OLDPWD
        else
                echo "Checking out new branch $branch"
                git worktree add $branch $branch
        fi
done

# check for branches that have been deleted on the remote
for branch in origin/*; do
        if ! git show-ref --verify refs/remotes/$branch --quiet; then
                echo "Removing worktree $branch"
                git worktree remove $branch
        fi
done

git worktree prune


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接