web-dev-qa-db-ja.com

Gitリポジトリを特定のリビジョン/チェンジセットでクローンするにはどうすればいいですか?

どのようにしてgitリポジトリを特定のリビジョンでクローンすることができますか?これは私が普段Mercurialで行っているようなものです:

hg clone -r 3 /path/to/repository
337
John

UPDATE 2 Git 2.5.0 以降、以下の機能は設定変数uploadpack.allowReachableSHA1InWantを使ってサーバー側で有効にできます。ここでは GitHub機能要求この機能を有効にするGitHubコミット 。 Gitサーバーの中にはデフォルトでこのオプションを有効にするものがあります。 Bitbucket Serverは version 5.5+ 以降有効にしました。設定オプションを有効にする方法の例については、 Stackexchangeに対する回答 を参照してください。

UPDATE 1 Gitバージョンの場合1.7 < v < 2.5Vaibhav Bajpai's answer に記述されているようにgit cloneとgit resetを使います。

完全なリポジトリを取得したくない場合は、おそらくcloneを使用すべきではありません。フェッチしたいブランチを選択するためには、常にフェッチを使用するだけです。私はhgのエキスパートではないので-rの詳細を知りませんがgitではあなたはこのようなことをすることができます。

# make a new blank repository in the current directory
git init

# add a remote
git remote add Origin url://to/source/repository

# fetch a commit (or branch or tag) of interest
# Note: the full history up to this commit will be retrieved unless 
#       you limit it with '--depth=...' or '--shallow-since=...'
git fetch Origin <sha1-of-commit-of-interest>

# reset this repository's master branch to the commit of interest
git reset --hard FETCH_HEAD
162
CB Bailey
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

最新のコミットに戻る

$ git pull
769
Vaibhav Bajpai

Gitリポジトリをクローンすると、リポジトリ全体がクローンされます。クローンを作成するリビジョンを1つだけ選択する方法はありません。ただし、git cloneを実行すると、checkout <rev>を実行して特定のリビジョンをチェックアウトできます。

49
user113292

最初から特定の時点までのすべてを取得したいという場合は、Charles Baileyの答えが完璧です。逆の操作をして現在の日付からさかのぼって履歴のサブセットを取得したい場合は、git clone --depth [N]を使用できます。ここでNは必要な履歴の回転数です。しかしながら:

--depth

指定したリビジョン数まで切り捨てられた履歴を持つ、シャロークローンを作成します。浅いリポジトリにはいくつかの制限があります(クローンを作成したりそこから取得したり、そこからプッシュしたりすることはできません)が、長いプロジェクトの最近の履歴のみに興味がある場合は十分です。パッチとして修正を送ってください。

30
Walter Mundt

まとめると(git v。1.7.2.1):

  1. レポが欲しいところで定期的にgit cloneをしてください。
  2. あなたが望むrevのgit checkout <sha1 rev>
  3. git reset --hard
  4. git checkout -b master
24
phill

TL; DR - クローンしたいコミットに対してソースリポジトリにタグを作成し、そのタグをfetchコマンドで使用するだけです。後で元のリポジトリからタグを削除してクリーンアップすることができます。

2014年のCharles Baileyの答えは今では古くなっており、他の答えのほとんど(すべて)はクローン作成に関係しています。

以下の解決策は、OPや他の多くの人が探しているものを達成します。これは、履歴を含むリポジトリのコピーを作成する方法です。

これはgitバージョン2.1.2でローカルレポジトリ(つまり別のディレクトリのリポジトリ)をある時点までクローンするために使ったコマンドです:

# in the source repository, create a tag against the commit you want to check out
git tag -m "Temporary tag" tmptag <sha1>

# create a new directory and change into that directory
cd somewhere_else;mkdir newdir;cd newdir

# ...and create a new repository
git init

# add the source repository as a remote (this can be a URL or a directory)
git remote add Origin /path/to/original/repo

# fetch the tag, which will include the entire repo and history up to that point
git fetch Origin refs/tags/tmptag

# reset the head of the repository
git reset --hard FETCH_HEAD

# you can now change back to the original repository and remove the temporary tag
cd original_repo
git tag -d tmptag

うまくいけば、このソリューションはさらに数年間働き続けます! :-)

19
JamesG

あなたは単にgit checkout <commit hash>を使うことができます

この順序で

bash git clone [URLTORepository] git checkout [commithash]

ハッシュのコミットは次のようになります。 "45ef55ac20ce2389c9180658fdba35f4a663d204"

10
M.Othman

特定のブランチやタグで/ - 単一の特定のコミットのみ をクローンするには:

git clone --depth=1 --branch NAME https://github.com/your/repo.git

残念なことに、NAMEはブランチ名またはタグ名にしかなれません(SHAをコミットしないでください)。

--depthフラグを省略して履歴全体をダウンロードしてから、そのブランチまたはタグをチェックアウトします。

git clone --branch NAME https://github.com/your/repo.git

これは最近のバージョンのgitで動作します(私はバージョン2.18.0でそれを行いました)。

5
Peter Kovac

git clone https://github.com/ORGANIZATION/repository.git(リポジトリをクローンする)

cd repository (navigate to the repository)

git fetch Origin 2600f4f928773d79164964137d514b85400b09b2

git checkout FETCH_HEAD

2
JeffDropsIT

上記の答えのうち2つを使って( 特定のリビジョン/チェンジセットを使ってgitリポジトリをクローンする方法? および 特定のリビジョン/チェンジセットを使ってgitリポジトリをクローンする方法? )私は決定的な結論を出しました。ポイントまでクローンしたい場合は、そのポイントは単にSHAではなくタグ/ブランチである必要があります。そうしないと、FETCH_HEADが混乱します。 gitフェッチセットに続いて、ブランチ名やタグ名を使用した場合はレスポンスが返されます。単にSHA-1を使用した場合はレスポンスが返されません。
これが私がしたことです: - 実際のOriginから、フルリポジトリの完全に機能するクローンを作成します。

cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git 

それから面白いところでローカルブランチを作成してください

git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b Origin_point

それから私の新しいコピーを作成し、私のローカルコピーを元にします。

cd <path to create repo>
mkdir reduced-repo
cd reduced-repo
git init
git remote add local_copy <path to create repo>/ui
git fetch local_copy Origin_point

その時点で私はこの反応を得ました。上記のブランチの代わりにSHA-1を使用しても何も起こらないので、反応はうまくいったことを意味します。

/var/www/html/ui-hacking $ git fetch local_copy原点
 remote:個数を数えるオブジェクト:45493、done 
 remote:数を圧縮するオブジェクト:100%(15928/15928)リモート:合計45493(デルタ27508)、再利用45387(デルタ27463)
オブジェクトを受信中:100%(45493/45493)、53.64 MiB | [完了] 50.59 MiB/s、完了しました。
解決デルタ:100%(27508/27508)、完了しました。
 /var/www/html/uiから[*] *分岐Origin_point  - > FETCH_HEAD 
 * [新しい枝] Origin_point  - > Origin/origin_point 

今私の場合は、それをgitlabに戻す必要がありました。

git remote add Origin git@<our gitlab server>:ui-developers/new-ui.git

つまり、git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -kを使ってリモートからチェリーピックして、git Push Originを使って新しい家に全部アップロードすることで、Origin_pointからリポジトリを再構築することができました。

誰かに役立つことを願っています

2
sibaz

私のバージョンは、広く認められた回答と最も支持された回答を組み合わせたものです。誰もがSHA1を使っていますが、それを取得する方法を誰にも教えてくれないので、それは少し違います。

$ git init
$ git remote add <remote_url>
$ git fetch --all

今、あなたはすべてのブランチとコミットを見ることができます

$ git branch -a
$ git log remotes/Origin/master <-- or any other branch

最後にあなたは希望するコミットのSHA1を知っています

git reset --hard <sha1>
2
vladkras

このスニペットをGNU makeで使用して、リビジョンタグ、ブランチ、またはハッシュを閉じます

gitバージョン2.17.1でテストされました

${dir}:
    mkdir -p ${@D}
    git clone --recursive --depth 1 --branch ${revison} ${url} ${@} \
 || git clone --recursive --branch ${revison} ${url} ${@} \
 || git clone ${url} ${@}
    cd ${@} && git reset --hard ${revison}
    ls $@




0
RzR

それは簡単です。現在のブランチにアップストリームを設定するだけです

$ git clone repo
$ git checkout -b newbranch
$ git branch --set-upstream-to=Origin/branch newbranch
$ git pull

それで全部です

0
NEOJPK