在git中只克隆stable和另一个分支?

rhfm7lfc  于 2023-02-07  发布在  Git
关注(0)|答案(5)|浏览(129)

我刚刚开始使用git,我有一个问题。我的应用有10个其他开发者在开发它,每个人都有自己的分支,比如dev_XXXXX。那么如果我克隆仓库,他们所有的代码会被复制到我的机器上吗?在这种情况下,我不想这样。假设我的分支是dev_swamy,我如何只克隆稳定分支和dev_swamy?谢谢。

k10s72fa

k10s72fa1#

默认情况下,git clone将获取所有分支,但这些分支将存储为远程跟踪分支:例如,分支“dev_XXXXX”将存储为“origin/dev_XXXXX”(全名为“refs/remotes/origin/dev_XXXXX”)。这些远程跟踪分支在git branch输出中不可见:你需要git branch -r来列出远程跟踪分支(或者git branch -a来列出所有分支)。如果那些分支不偏离主线太多,它们就不会占用仓库太多的磁盘空间。因此我不明白为什么你只想克隆选定的分支。
不过,如果您希望克隆只包含两个选定分支,可以按如下方式操作:
1.首先,创建新的空存储库

$ mkdir repoclone
$ cd repoclone/
$ git init
Initialized empty Git repository in /home/user/repoclone/.git/

1.然后将仓库命名为'origin'(就像“git clone”命名它一样),只需要跟踪两个分支:“master”和“dev_swmy”,使用“git remote“命令。请检查是否正确添加。

$ git remote add -t master -t dev_swamy origin user@example.com:repo.git
$ git remote 
origin
$ git remote show origin
* remote origin
  Fetch URL: user@example.com:repo.git
  Push  URL: user@example.com:repo.git
  HEAD branch: master
  Remote branches:
    master          new (next fetch will store in remotes/origin)
    dev_swamy new (next fetch will store in remotes/origin)

如果stable分支被称为“stable”而不是“master”,你当然要修改上面的例子。如果你想指定的分支成为remote中的默认分支,还有-m <branch>选项。
1.从'origin'获取(您也可以使用-f选项来执行上述“git remote add”操作):

$ git fetch
remote: Counting objects: 282, done.
remote: Compressing objects: 100% (193/193), done.
remote: Total 282 (delta 82), reused 0 (delta 0)
Receiving objects: 100% (282/282), 81.30 KiB | 135 KiB/s, done.
Resolving deltas: 100% (82/82), done.
From user@example.com:repo.git
 * [new branch]      master     -> origin/master
 * [new branch]      dev_swamy -> origin/dev_swamy
From user@example.com:repo.git
 * [new tag]         v1.0       -> v1.0
 * [new tag]         v1.0.1    -> v1.0.1
 * [new tag]         v1.1       -> v1.1

1.设置本地分支'master'(在这里你可以工作)跟随'origin/master'(让'origin/master'作为上游),就像“git clone”所做的那样:

$ git checkout -t origin/master
Branch master set up to track remote branch master from origin.
Already on 'master'

您可以对分支“dev_swmy”重复此操作。
1.现在你可以看到config文件是什么样子的。你可以通过编辑.git/config文件来得到完全相同的结果,然后执行“git fetch”

$ cat .git/config  # or just open this file in your editor
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = user@example.com:repo.git
        fetch = +refs/heads/master:refs/remotes/origin/master
        fetch = +refs/heads/dev_swamy:refs/remotes/origin/dev_swamy
[branch "master"]
        remote = origin
        merge = refs/heads/master

在开始使用仓库之前,不要忘记向Git做自我介绍(例如,设置'user.name'和'user.email'配置变量;通常在每个用户的配置文件中)!

vtwuwzda

vtwuwzda2#

如果您进行克隆,则所有分支中的所有修订都会沿着,但默认情况下,克隆的存储库将 checkout master。
只提取选中的分支比较麻烦,因为git并不认为你应该这样做,你必须手动下拉分支:

mkdir repoclone
cd repoclone
git init
git remote add origin git://remote/url
git fetch origin master:master
git fetch origin dev_XXX:dev_XXX

以上是我所知道的有效的方法。然而,如果你想建立一个正常工作的git repo,只想更窄地查看它的远程分支,你可以很容易地做到这一点:

mkdir repoclone
cd repoclone
git init
git remote add origin git://remote/url

# now open .git/config for editing in your editor
# replace the following line (grab all remote branches)
fetch = +refs/heads/*:refs/remotes/origin/*

# replace with lines listing exactly which branches you want
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/dev_XXX:refs/remotes/origin/dev_XXX

# save the file, now run

git fetch
brjng4g3

brjng4g33#

另一种方法是避免直接克隆,而是手动添加一个具有自定义fetch refspecs集的远程。
例如:

mkdir myclone
cd myclone
git init

git remote add origin url://origin.repo

# Add fetch rules for the branches that we want to track
git config remote.origin.fetch +refs/heads/master:+refs/remotes/origin/master
git config --add remote.origin.fetch +refs/heads/dev_swamy:+refs/remotes/origin/dev_swamy

# fetch now fetches just what we need, subsequently it will do incremental fetches
git fetch

# Creating local branches tracking the remote branches
git checkout -b master origin/master
git branch dev_swamy origin/dev/swamy
mwg9r5ms

mwg9r5ms4#

我认为这里更重要的问题是其他人会推什么,而不是你会克隆或拉什么。既然每个开发人员都在他自己的分支上工作,另一个问题是你如何最终拥有一个公共的代码库。开发人员是否将他们的分支合并到master?然后他们是否将他们更改后的master分支推到一个中央存储库?如果是这样的话,无论如何,你都没有办法拉其他开发人员的分支。
如果不是这样,我看不出你如何能组成一个有效的团队。
我最后想到:我很好奇为什么你不想把其他开发者的分支克隆到你的仓库中?

ev7lccsx

ev7lccsx5#

可能还有一种更现代的方法(使用网上找到的小型随机回购协议):
对特定的分支执行干净的 checkout ,并且只 checkout 该分支。

$ git clone https://github.com/martinmimigames/little-music-player --single-branch --branch=main 
Cloning into 'little-music-player'...
remote: Enumerating objects: 1187, done.
remote: Counting objects: 100% (292/292), done.
remote: Compressing objects: 100% (142/142), done.
remote: Total 1187 (delta 114), reused 243 (delta 82), pack-reused 895
Receiving objects: 100% (1187/1187), 1.61 MiB | 9.38 MiB/s, done.
Resolving deltas: 100% (487/487), done.

走进收银台:

$ cd little-music-player

显示已知的分支(确认仅1个所需分支已知):

$ git branch --all
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main

获取另一个分支:

$ git fetch origin m3u:m3u
From https://github.com/martinmimigames/little-music-player
 * [new branch]      m3u        -> m3u

再次列出已知分支:

$ git branch --all
  m3u
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main

为了提高大型回购的性能,如果您计划在两个分支之间执行一些工作,并且您知道它们之间只有最近的偏差(深度的值由您决定),则可以在 checkout 中添加--depth nnn选项。
如果您只打算操作repo中的特定文件,那么使用稀疏 checkout 是另一种选择(在执行提取之前,按照git init和config更改的方式进行设置--这是一种非常不同的方式)。
希望这个有用。

相关问题