Git - 每个分支的单独文件夹。设置它

时间:2013-02-22 18:38:45

标签: git branch directory

我需要在3个单独的文件夹中保留3个分支。 (我知道这不是做事的一种方式。但我出于某种原因需要这样做。)

让我们说回购的名字是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 <repo>。但它默认为master。我不知道如何在这里初始化staging分支。

4 个答案:

答案 0 :(得分:11)

我认为你可能必须在你的回购中创建所有分支

$ 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]

答案 1 :(得分:7)

由于git 2.5引入了git worktree命令,因此您想要实现的目标变得更简单(甚至是微不足道)。

基本上,你的git repo现在有完全免费的签出分支数量,称为工作树:

  • 0(一个简单的回购)
  • 1(正常回购)
  • n&gt; 1,正常的仓库,你添加了n-1个工作树

如果你的回购已包含你的分支,你可以这样做:
git worktree add <path to branch> <branch name>
或者,如果尚未创建该分支并且您想要分支master:
git worktree add -b <new branch name> <path to branch> master

你去吧。请注意,您无法同时签出多个存储库中的分支。

答案 2 :(得分:0)

问题中提出的上述情况在以下情况中非常有效。

  1. 微服务:例如,AWS Lambda开发在lambda上进行一两个开发工作,据说总共有70个lambda。因此,包含test和code_folder的70个文件夹。如果是单片系统,则必须通过零合并问题来确保系统的所有部分一起工作。但是这里70个文件夹中的每一个都是独立的,除了很少的全局配置和共享的文件夹。

  2. Monorepo :大型公司使用monorepo来管理大型项目的所有子项目,包括移动应用程序,网站,后端和其他相关内容。

如果每个分支轨道仅在其文件夹中更改,则Master分支可能具有或不具有所有代码。

一种实现方法,首先为共享模块创建一个共享分支。 然后,创建多个分支,每个分支均以空文件夹开头。 永远不要将您的分支与主分支合并,只能拉共享分支在本地合并您的分支并推送到远程分支。

因此,远程服务器上的每个分支都有共享模块和您的代码。

答案 3 :(得分:0)

这是一个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