PCに複製せずに、リモートGitリポジトリから特定のコミットを1つだけ取得する方法はありますか?リモートリポジトリの構造は私のリポジトリとまったく同じなので、競合は発生しませんが、これを行う方法がわからず、巨大なリポジトリのクローンを作成したくありません。
gitは初めてですが、方法はありますか?
PCに複製せずに、リモートGitリポジトリから特定のコミットを1つだけ取得する方法はありますか?リモートリポジトリの構造は私のリポジトリとまったく同じなので、競合は発生しませんが、これを行う方法がわからず、巨大なリポジトリのクローンを作成したくありません。
gitは初めてですが、方法はありますか?
回答:
Gitバージョン2.5以降(2015年第2四半期)以降、実際には(完全なリポジトリを複製せずに)単一のコミットをフェッチすることが可能です。
参照してください68ee628をコミットすることにより、フレドリックメドレー(moroten
)、5月21日2015年
(で合併Junio C浜野- gitster
-でa9d3493コミット、2015年6月1日)
これで新しい設定ができました(サーバー側)
uploadpack.allowReachableSHA1InWant
upload-pack
参照チップから到達可能なオブジェクトを要求するフェッチ要求を受け入れることを許可します。ただし、オブジェクトの到達可能性の計算には計算コストがかかることに注意してください。
デフォルトはfalse
です。
そのサーバー側の構成をシャロークローン(git fetch --depth=1
)と組み合わせると、単一のコミットを要求できます(t/t5516-fetch-push.sh
:
git fetch --depth=1 ../testrepo/.git $SHA1
git cat-file
次のコマンドを使用して、コミットがフェッチされたことを確認できます。
git cat-file commit $SHA1
「
git upload-pack
」それはあります「git fetch
」と、限り、彼らはREFから到達可能なように、任意のREFの先端ではないコミットを果たすのかを知らせることができますuploadpack.allowReachableSHA1InWant
設定変数。
完全なドキュメントは次のとおりです。
upload-pack
:必要に応じて、到達可能なsha1のフェッチを許可しますでは
uploadpack.allowReachableSHA1InWant
、サーバー側の設定オプションのセット、「git fetch
欲しい」行その名前宣伝されていないオブジェクト(おそらくバンドのか、サブモジュールのポインタから得られているために)「との要求を行うことができます」。
ブランチの先端から到達可能なオブジェクト、つまり、アドバタイズされたブランチとによって非表示にされたブランチの結合のみtransfer.hideRefs
が処理されます。
到達可能性を確認するために履歴をさかのぼることには関連するコストがかかることに注意してください。この機能は、特に浅いフェッチを使用する場合、リポジトリ全体を複製する必要なしに、sha1が既知である特定のコミットのコンテンツを取得するときに使用できます。。
有用なケースは例えば
- 履歴に大きなファイルを含むリポジトリ、
- サブモジュールのチェックアウトに必要なデータのみをフェッチし、
- 変更番号の代わりにコミットの観点から考えると、それが属している正確なブランチを知らずにsha1を共有する場合、およびGerrit内で。
(allowTipSHA1InWant
すべてのGerritの変更には参照があるため、Gerritのケースはすでに解決されています。)
Git 2.6(2015年第3四半期)では、このモデルが改善されます。Jeff King()によるcommit 2bc31d1、commit cc118a6(2015年7月28日)を
参照してください。(による合併Junio C浜野- -で824a0beコミット、2015年8月19日)をpeff
gitster
refs
:ネガティブをサポートtransfer.hideRefs
構成を使用して参照の階層を非表示にする場合
transfer.hideRefs
、後でその構成をオーバーライドして「再表示」する方法はありません。
このパッチは、「負の」非表示を実装します。これにより、別の一致によって非表示にされたとしても、一致はすぐに非表示としてマークされます。
通常の「最後の1つが勝つ」設定の優先順位が機能するように、設定機械からのフィードとは逆の順序で一致を適用するよう注意します(.git/config
たとえば、のエントリはオーバーライドされます)/etc/gitconfig
)。だからあなたは今やることができます:
git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'
refs/secret
特定の1つのリポジトリの1つの公開ビットを除いて、すべてのリポジトリに非表示にします。
Git 2.7(2015年11月/ 12月)が再び改善されます。
コミット948bfa2を参照、00b293eコミット、(2015年11月5日)を78a766aコミット、92cab49をコミットし、92cab49コミット、92cab49コミット(2015年11月3日)、00b293eをコミットし、00b293eコミット(2015年11月5日)を、そして92cab49をコミットし、92cab49コミット、92cab49をコミットし、コミット92cab49(03 Nov 2015)by Lukas Fleischer(lfos
)。
協力者:エリックサンシャイン(sunshineco
)。
(による合併ジェフ・キング- peff
-でdbba85eをコミットし、2015年11月20日)
config.txt
:のセマンティクスを文書化するhideRefs
名前空間し現在のところ、
transfer.hideRefs
名前空間が設定された場合の動作の明確な定義はありません。その場合
、hideRefs
接頭辞は省略された名前と一致することを説明します。これが、hideRefs
パターンが現在receive-packで処理される方法です。hideRefs:完全参照のマッチングのサポートを追加
ストリップされた参照の照合に加え
hideRefs
て、完全な(ストリップされていない)参照が照合されるパターンを追加できるようになりました。
完全一致と完全一致を区別するには、これらの新しいパターンの先頭にサーカムフレックス(^
)を付ける必要があります。
したがって、新しいドキュメント:
transfer.hideRefs:
名前空間が使用されている場合、名前空間プレフィックスは、
transfer.hiderefs
パターンと照合される前に各参照から削除されます。
例えば、場合がrefs/heads/master
で指定されtransfer.hideRefs
、現在の名前空間がされfoo
、その後、refs/namespaces/foo/refs/heads/master
広告から省略されているが、refs/heads/master
とrefs/namespaces/bar/refs/heads/master
はまだ、いわゆる「持っている」ラインとして宣伝されています。
ストリッピングの前に参照を照合するに^
は、参照名の前にa を追加します。あなたが結合した場合!
と^
、!
最初に指定する必要があります。
R ..はコメントでconfig について言及しています。uploadpack.allowAnySHA1InWant
これにより、オブジェクトを要求upload-pack
するfetch
リクエストを受け入れることができます。(デフォルトはfalse
)。
David "novalis" Turner()によるcommit f8edeaa(2016年11月、Git v2.11.1)を参照してください。novalis
upload-pack
:オプションで、sha1のフェッチを許可するユーザーがリポジトリ内のすべてに絶対にアクセスすることを信頼している場合、到達可能性チェックを行うのは少しばかげているようです。
また、分散システムでは際どい-1つのサーバーがrefをアドバタイズするが、別のサーバーがそのrefに強制的にプッシュし、2つのHTTPリクエストがこれらの異なるサーバーに向けられる可能性がある。
uploadpack.allowAnySHA1InWant
ことに、到達可能性の計算ペナルティ(およびDoSベクトル)がありません。
複製は1回だけなので、リモートリポジトリの複製がすでにある場合、そこからプルしてもすべてが再度ダウンロードされるわけではありません。プルするブランチを指定するか、変更をフェッチして、必要なコミットをチェックアウトします。
新しいリポジトリからのフェッチは非常には帯域幅安価です。これは、必要のない変更のみをダウンロードするためです。最小の負荷で、Gitが正しいことを行うという観点から考えてください。
Gitはすべてを.git
フォルダーに格納します。コミットをフェッチして分離して保存することはできません。すべての祖先が必要です。それらは相互に関連しています。
ただし、ダウンロードサイズを小さくするには、特定のブランチまたはコミットに関連するオブジェクトのみをフェッチするようにgitに要求できます。
git fetch origin refs/heads/branch:refs/remotes/origin/branch
これにより、リモートブランチに含まれるコミットのみbranch
(および見逃したコミットのみ)がダウンロードされ、次の場所に格納されます。origin/branch
ます。その後、マージまたはチェックアウトできます。
SHA1コミットのみを指定することもできます。
git fetch origin 96de5297df870:refs/remotes/origin/foo-commit
これにより、指定されたSHA-1 96de5297df870(およびその祖先)のコミットのみがダウンロードされ、(存在しない)リモートブランチとして保存されorigin/foo-commit
ます。
2.7.4-0ubuntu1.3
。ただし、2.16.2-0ppa1~ubuntu16.04.1
git-core PPAから使用する場合、これは正常に機能します。修正されたバグのように聞こえます。クイック検索でそれへの参照を見つけることができませんでした。誰かが私にそれについてのポインタを得ることができるなら、私はこの修正をバックポートしてもらいたいです。
私は私のgitリポジトリをプルしました:
git pull --rebase <repo> <branch>
gitがブランチのすべてのコードを取得できるようにしてから、興味のあるコミットにリセットしました。
git reset --hard <commit-hash>
お役に立てれば。
git reset --hard
、一般化されたソリューションで共有されると、データを失う(または、この場合、データを取り戻すことが重要な状態にある)トラップに人々を導く可能性があります。
あなたは単純にリモートリポジトリの単一のコミットをフェッチすることができます
git fetch <repo> <commit>
どこ、
<repo>
リモートリポジトリ名(例:)origin
またはリモートリポジトリURL(例:https://git.foo.com/myrepo.git
)<commit>
SHA1コミットにすることができます例えば
git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545
コミット(および欠落している祖先)をフェッチした後は、次のコマンドで単純にチェックアウトできます。
git checkout FETCH_HEAD
これにより、「ヘッドが取り外された」状態になります。
fetch
あなたがそうしているように私が特定のリビジョンにしようとすると、gitはエラーコード1で失敗し、出力はありません。これは以前のバージョンで機能していたものですか?(私はv2.0.2です。)
fetch
が、その場合、私は用途が何であるかわかりません。
git checkout FETCH_HEAD
助けます。
--depth=1
)では機能しません。
次のようにして、単純にリモートリポジトリをフェッチできます。
git fetch <repo>
どこ、
<repo>
リモートリポジトリ名(などorigin
)またはリモートリポジトリURL(例https://git.foo.com/myrepo.git
)でもかまいません例えば:
git fetch https://git.foo.com/myrepo.git
レポジトリを取得した後、必要なコミットをマージできます(質問は1つのコミットの取得に関するものなので、マージではなく、cherry-pickを使用して1つのコミットのみを選択できます)。
git merge <commit>
<commit>
SHA1コミットにすることができます例えば:
git cherry-pick 0a071603d87e0b89738599c160583a19a6d95545
または
git merge 0a071603d87e0b89738599c160583a19a6d95545
マージしたい最新のコミットである場合は、FETCH_HEAD変数も使用できます。
git cherry-pick (or merge) FETCH_HEAD
git config set uploadpack.allowReachableSHA1InWant
?
これは最もよく機能します:
git fetch origin specific_commit
git checkout -b temp FETCH_HEAD
「temp」という名前を付けます。ただし、このブランチは孤立している可能性があります
最後に、git cherry-pickを使用して特定のコミットを複製する方法を見つけました。ローカルにリポジトリがなく、リモートから特定のコミットをプルしていると仮定すると、
1)ローカルに空のリポジトリを作成し、git init
2)git remote add origin " url-of-repository "
3)git fetch origin [マージしない限り、ファイルはローカルワークスペースに移動されません]
4)git cherry-pick " Enter-long-commit-hash-that-need-need "
完了。このようにすると、特定のコミットのファイルのみがローカルにあります。
-> git log --pretty = onelineを使用してこれを取得できます
私は 'git ls-remote'(http://git-scm.com/docs/git-ls-remote)があなたが望むことをするべきだと思います。強制フェッチまたはプルなし。