Gitで単一のブランチを複製するにはどうすればよいですか?


799

プロジェクトのスケルトンを保存するために使用する「skeleton」というローカルGitリポジトリがあります。さまざまな種類のプロジェクトのために、いくつかのブランチがあります。

casey@agave [~/Projects/skeleton] git branch
* master
  rails
  c
  c++

新しいプロジェクトのマスターブランチをチェックアウトしたい場合は、

casey@agave [~/Projects] git clone skeleton new
Initialized empty Git repository in /Users/casey/Projects/new/.git/

そして、すべてが私がそれを望んでいる方法です。具体的には、新しいマスターブランチはスケルトンマスターブランチをポイントしており、押したり引いたりして、基本的なプロジェクトセットアップの変更を移動できます。

ただし、機能しないのは、別のブランチのクローンを作成する場合です。取得できないので、たとえばrailsブランチなど、必要なブランチのみをプルし、新しいリポジトリには、デフォルトでmasterスケルトンリポジトリのrailsブランチにプッシュおよびプルするブランチがあります。

これを行うための良い方法はありますか?あるいは、これはGitが物事を構成することを望んでいる方法ではないかもしれませんし、私は確かにそれを受け入れています。おそらく、Ruby on Railsスケルトンリポジトリがマスタースケルトンリポジトリを追跡しているため、複数のリポジトリが必要ですか?そして、Ruby on Railsスケルトンリポジトリを複製する個々のプロジェクト。


何がgit branch -a表示されますか?
JakubNarębski、2009年

3
うはgit checkout -b newbranch origin/branchiwant良い作品?(--trackオプションなし)
VonC

3
あなたがそこでやろうとしていることは悪い考えだと思います。プロジェクトごとに異なるリポジトリを使用します。枝はまったく違うものです。
2009年

@マンニ、私はちょっと考えていました、なぜならgitは私がやっていることを好きではないようだったからです。理由を説明できますか?枝が長持ちしてはいけないからでしょうか?
Casey Rodarmor、2009年

1
@rodarmor私があなたがそこでやろうとしていることは良い考えだと思います、そして私はまさにこの質問をしました。
Paul Du Bois

回答:


863

注:git1.7.10(2012年4月)では、実際には1つのブランチのみ複製できます。

# clone only the remote primary HEAD (default: origin/master)
git clone --single-branch

as in:
git clone <url> --branch <branch> --single-branch [<folder>]

あなたはそれを見ることができますt5500-fetch-pack.sh

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

東部は 次のようにコメントしています。

これは、浅いクローンを作成する場合は暗黙的です。
これはgit clone --depth 1、帯域幅を節約する最も簡単な方法です。

また、Git 1.9.0(2014年2月)以降、浅いクローンはデータ転送(プッシュ/プル)をサポートしているため、このオプションはさらに便利になりました。
詳細についてgit clone --depth 1、「(浅いクローン)は実際よりも便利ですか?」を参照してください。


浅いクローンの「取り消し」の詳細は、「浅いクローンを完全なクローンに変換する」(git 1.8.3+)を参照してください。

# unshallow the current branch
git fetch --unshallow

# for getting back all the branches (see Peter Cordes' comment)
git config remote.origin.fetch refs/heads/*:refs/remotes/origin/*
git fetch --unshallow

クリスのコメント:

不足しているブランチを反転させる魔法の行--single-branchは(git v2.1.4)です。

git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch --unshallow  

Git 2.26(2020年第1四半期)では、「git clone --recurse-submodules --single-branchはサブモジュールのクローンを作成するときに同じ単一ブランチオプションを使用するようになりました

Emily Shaffer()によるcommit 132f600commit 4731957(2020年2月21日)を参照してください。(合併によりJunio C浜野- -b22db26をコミットする、2020年3月5日)をnasamuffin
gitster

clone:--recurse-submodules中に--single-branchを渡します

サインオフ:Emily Shaffer
Acked-by:Jeff King

以前は、「git clone --recurse-submodules --single-branch」を実行すると、スーパープロジェクトが1つのブランチのみを複製した場合でも、サブモジュールがすべてのブランチを複製しました。

--single-branchサブモジュールヘルパーフレームワークをパイプ処理して、clone後で' 'にします。


80
git clone <url> --branch <branch> --single-branch <folder>魅力のように動作します。
アレクサンダー

1
うん

5
また、これは、浅いクローンを作成する場合には暗黙的です。これはclone --depth 1、帯域幅を節約する最も簡単な方法です。
東武

1
@TobuとVonC --depth 1は、新しいクローンで実際にプッシュ/プルしたい場合があるため、ユーザーにとって安全ではありません。
nmr

2
ただ、フルでピーター・コルド補正を綴るために、逆に枝を逃し取得するための魔法のラインが--single-branchあるgit config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*git fetch --unshallow(のgit v2.1.4)
クリス・

670

1つの方法は、以下を実行することです。

git clone user@git-server:project_name.git -b branch_name /your/folder

branch_name選択したブランチはどこにあり、「/ your / folder」はそのブランチの宛先フォルダーです。これが他のブランチをもたらし、前後にマージする機会を与えることは事実です。

更新

Git 1.7.10から、これを実行できるようになりました

git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder

36
これは機能しますが、すべてのブランチをフェッチます。以下の@ frerich = raabeの回答を参照してください。
cdunn2001

3
ありがとうございます。私の場合は「-b branch_name」のみを追加してください。時間を大幅に節約できました。
PhatHV 2012

はい、完璧に動作します...!私はTFSの方が好きで、個人的なプロジェクトではgitを使用しています。Wrto git branching、私は以前に間違った方法でそれをしていたので、この簡単な方法を知っておくと良いです、そしてそれは完璧に思えます!再度、感謝します!既に+1されています。可能であれば+100を与えます:)
k25

11
--single-branchリポジトリに含まれるすべての履歴とタグの代わりに、このブランチに関連付けられた履歴のみをフェッチして追加することもできます。
flawyte 2014年

1
@AlexNolasco / some / folderとは何かを答えを編集してください。ありがとう
Nabin

112

Gitバージョン1.7.3.1(Windowsの場合)を使用して、次のことを行います($BRANCHチェックアウトするブランチの名前であり、$REMOTE_REPOクローン元のリモートリポジトリのURLです)。

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

このアプローチの利点は、後続のgit pull(またはgit fetch)呼び出しでも、要求されたブランチのみがダウンロードされることです。


スクリプトとこの行の違いは何ですか?git clone -b $BRANCH $REMOTE_REPO $BRANCH彼らは同じですか?
Ian Vaughan

12
@Ian:1つの違いは、git clone -bすべてのリモート参照(すべてのリモートブランチとタグ)がgit branch -a表示されることです。私のスクリプトでは、単一の参照を取得します。
Frerich Raabe、2011

1
上記($ BRANCH = "nick"など)を試すと、「致命的:リモート参照refs / heads / nickが見つかりませんでした」というメッセージが表示されます。うまくいかないようです...
Nick

3
-t $BRANCHなくても動作することに注意してください-f。次に、git fetch originフェッチし、git checkout $BRANCHローカルブランチとチェックアウトを確立します。これは、フェッチする前にリモートを設定する必要がある場合に役立ちますgit config remote.origin.uploadpack=/bin/upload-pack
cdunn2001

1
私は「古い」企業git(1.6.0.2)を使用しているため、上記のソリューションに縛られています。@Nickと同じ問題が発生しました。git branch -aを実行すると表示されorigin/$BRANCHます。やってgit checkout origin/$BRANCHこれを修正しました。
ジェリー博士2014

30

あなたは長々とした方法を試すことができます:

mkdir newrepo.git
cd newrepo.git
git init
git remote add origin file:///path/to/original
git fetch origin branchiwant:refs/remotes/origin/branchiwant
git checkout -b branchiwant --track origin/branchiwant

これは何ですか:

  • 空のGitリポジトリを作成して初期化します。
  • 元のリポジトリをoriginというリモートとして追加します。
  • 必要なブランチのみをリモートのoriginからフェッチします。
  • クローンしたばかりのソースブランチを追跡するように設定された新しいブランチを作成してチェックアウトします。

うまくいけば、それはあなたが求めているもののようなものになるでしょう。


git remote addの引数が入れ替わっていますが、チェックアウトを機能させることができませんでした。「git checkout origin / rails」を実行すると、「エラー:pathspec 'origin / rails'がgitで認識されているファイルと一致しませんでした。」代替案では、「致命的:gitチェックアウト:パスの更新はブランチの切り替えと互換性がありません。」
Casey Rodarmor、2009年

@rodarmor:おかげでgitリモートコマンドが修正されました。の出力を貼り付けることができますgit branch -rか?
jkp 2009年

@jkp、実際にgit branch -rは何も出力しません。
Casey Rodarmor、2009年

@rodarmor:私は例を修正しましたが、これは間違いなく動作します(テスト済み)。HTH(あなたがそれをあなたが好きなようにテストしたらそれを受け入れることができます;))
jkp

-bスイッチは比較的新しいものです。前回、debian squeezeで実行したとき、IIRCは利用できませんでした
sehe

23

以下のコマンドを使用して実行できます。

git clone -b branch_name --single-branch project_url local_folder_to_clone_in

2
完全に機能しましたが、実際にはソースツリーで単一のブランチを複製するのに問題があり、手動でそれを行いました
azhar22k

17

gitのクローンのmanページ

--single-branchクローン中の友達は覚えておく--branch <branch name>か、リモートプライマリヘッドのみをクローンしてください(デフォルトではマスター)

キャッシュからのものではなく、常に新しいソースを読み取るためにCtrl+ を実行することを忘れないでくださいF5:-)(私はこのオプションについて長い間知らなかったので。)


1
git clone <url> --branch <branch> --single-branch <folder>
shridutt kothari 2015

17
git clone <url> --branch <branch> --single-branch

URLとブランチ名を入力するだけです。


8

1つのブランチのみを複製します。これが最も簡単な方法です。

$ git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git

4

特定のブランチのクローンを作成するには、次のようにします。

git clone --branch yourBranchName git@yourRepository.git


3

公開鍵を持っていないGitのブランチを複製するには、これを使用します。

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>

2

cmdを開きます。

cd folder_name (ブランチを複製するパスを入力してください)

たった1つのコマンド:

git clone url_of_projecturltoclone -b branch_name

2

少し遅れましたが、この問題を解決するために使用したソリューションを追加したいと思いました。私はここで解決策を見つけました。

とにかく、質問は「別のリポジトリのブランチから新しいプロジェクトを始める方法は?」

これに対して、私が使用したソリューションは、最初にgithubまたはどこかに新しいリポジトリを作成することです。これは、新しいプロジェクトのリポジトリとして機能します。

ローカルマシンで、新しいプロジェクトのテンプレートとして使用するブランチがあるプロジェクトに移動します。

次のコマンドを実行します。

git push https://github.com/accountname/new-repo.git +old_branch:master

これにより、old_branchがnew-repoにプッシュされ、新しいrepoのマスターブランチになります。

次に、新しいリポジトリを新しいプロジェクトのローカルディレクトリに複製するだけで、古いブランチで新しいプロジェクトが開始されます。


2

フラスコレポの例を見てみましょう。マスターの他に3つのブランチがあります。1.1.xリモートブランチをチェックアウトしましょう

gitリポジトリのクローンを作成する

git clone https://github.com/pallets/flask

リポジトリにcdします。

cd flask

リモートブランチ1.1.xをフェッチする

git fetch origin 1.1.x

ブランチをチェックアウトする

git checkout 1.1.x

ブランチ1.1.xに切り替えると、リモート1.1.xブランチが追跡されます。



0

浅いクローンが必要な場合は、次の方法でこれを行うことができます。

git clone -b mybranch --depth=1 https://example.com/myproject.git localname

--depth=1を意味し--single-branchます。


0

これには主に2つの解決策があります。

  1. -bコマンドスイッチでブランチ名を指定する必要があります。特定のgitブランチを複製するコマンドの構文は次のとおりです。

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

例: git clone -b tahir https://github.com/Repository/Project.git

次のコマンドは、gitリポジトリからブランチtahirを複製します。上記のコマンドは、特定のブランチのみを複製しますが、他のブランチの詳細をフェッチします。コマンドですべてのブランチの詳細を表示できます。 git branch -a

  1. '--single-branch'フラグを使用して、以下のように他のブランチの詳細を取得しないようにすることができます。

git clone -b <BRANCH_NAME> --single-branch <GIT_REMOTE_URL>

例: git clone -b tahir --single-branch https://github.com/Repository/Project.git

今あなたがするなら git branch -a、複製した現在の単一のブランチのみが表示され、すべてのブランチは表示されません。

それがいつか誰かを助けることを願っています!! ...


0

このコマンドを使用して、単一のブランチをgitし、ブランチをスタンドアロンにしたい場合はフォルダーの名前を変更できます

git clone -b [branch-name] --single-branch [url]  [folder_name]

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch


-1

2つのステップで実行できます

  1. リポジトリを複製する

    • git clone <http url>
  2. 必要なブランチをチェックアウトします

    • git checkout $BranchName
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.