web-dev-qa-db-ja.com

深さ1の特定のコミットを浅くクローンする方法は?

リポジトリ内の特定のコミット、つまり深さ1の浅いクローンを作成することは可能ですか?何かのようなもの

git clone http://myrepo.git 728a4d --depth 1

SHA 728a4d...?]でコミット時のリポジトリの状態を取得するには

その理由は、特定のコミットでのリポジトリの状態にのみ関心がある場合、リポジトリ全体を複製する必要を回避し、その特定のコミットをチェックアウトすることです。

50
Chin

Git 2.5.0以降(bothクライアントとサーバー側で利用可能にする必要があります)サーバー側でuploadpack.allowReachableSHA1InWant=trueを設定して特定のSHA1のフェッチを有効にできます:

git init
git remote add Origin <url>
git fetch --depth 1 Origin <sha1>
git checkout FETCH_HEAD

git cloneで直接これを行うための構文が見つからなかったことに注意してください。

41
sschuberth

注:私の例では、コミットハッシュを使用してクローンを作成することはできませんが、タグのクローンを作成して軽量のリポジトリを作成することはできます。

「クローン」にコミットを1つだけ持つ必要があり、コミットハッシュを使用する場合、短い答えは[〜#〜 ] no [〜#〜]

このコマンドの構成(v2.13.2.windows.1でテスト済み)をタグに使用します。

git clone --depth 1 [email protected]:VENDOR/REPO.git --branch 1.23.0 --single-branch

1.23.0-コミットハッシュまたはブランチのいずれかです。

完全な例:

$ git clone --depth 1 [email protected]:Seldaek/monolog.git --branch 1.23.0 --single-branch
Cloning into 'monolog'...
remote: Counting objects: 201, done.
remote: Compressing objects: 100% (188/188), done.
remote: Total 201 (delta 42), reused 32 (delta 5), pack-reused 0
Receiving objects: 100% (201/201), 190.30 KiB | 0 bytes/s, done.
Resolving deltas: 100% (42/42), done.
Note: checking out 'fd8c787753b3a2ad11bc60c063cff1358a32a3b4'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

$ cd monolog

.git dirサイズ(267Kvs2.6Mフルclone)を使用して:

$ du -h --max-depth=0 .git
267K    .git

--branchはタグ/ブランチを取ることができます。

https://git-scm.com/docs/git-clone#git-clone---branchltnamegt

--branchは、タグを取得し、結果のリポジトリのそのコミットでHEADをデタッチします。

[〜#〜] upd [〜#〜]

一言で言えば、「参照」を取ることができます。詳細はこちらをご覧ください:gitエラーメッセージ「サーバーは非広告オブジェクトのリクエストを許可しません」とはどういう意味ですか?

また、次のようなトリックはありません:

git fetch --depth 1 Origin <COMMIT_HASH>

@BenjiWiebe、私の間違いを指摘してくれてありがとう。

12
Kirby

即時の答えは次のとおりです。
なぜ?詳細な説明はここにあります: なぜGitクローン固有のコミットオプションがないのですか?

他に何ができますか?

特定のコミットにリポジトリをクローンする方法は? (フルクローン)

# Create empty repository to store your content
git clone <url>
git reset <sha-1> --hard

詳細:

単一のブランチをクローンする方法は?

git clone <url> --branch <branch_name> --single-branch <folder_name>

特定のブランチから最新のコミットのみをクローンする方法は?

git clone <url> --depth=1 --branch <branch_name> --single-branch <folder_name>

深さ1の特定のコミットを浅くクローンする方法は?

@sschuberthがコメントアウトしたように:--depth--single-branchを意味します。

クローンの代わりに、fetchコマンドを使用します。

# fetch a commit (or branch or tag) of interest
# In this case you will have the full history of this commit
git fetch Origin <sha1>
4
CodeWizard

Bashでwhileを使用してみてください:

git clone --depth=1 $url
i=1; while ! git show $sha1; do git fetch --depth=$((i+=1)); done

これは、各コミットを個別にフェッチするため、かなり低速です。 (バッチでコミットを取得し、ネットワーク上のパフォーマンスを向上させるために)増分を増やすこともできますが、それでも総当たり的なアプローチです。

2
Corin