Mercurialで通常行うように、特定のリビジョンでgitリポジトリを複製するにはどうすればよいですか。
hg clone -r 3 /path/to/repository
Mercurialで通常行うように、特定のリビジョンでgitリポジトリを複製するにはどうすればよいですか。
hg clone -r 3 /path/to/repository
回答:
UPDATE 2 Git 2.5.0以降、以下で説明する機能は構成変数を使用してサーバー側で有効にできますuploadpack.allowReachableSHA1InWant
。ここでは、GitHub機能リクエストとGitHubコミットがこの機能を有効にしています。一部のGitサーバーはデフォルトでこのオプションをアクティブにします。たとえば、Bitbucket Serverはバージョン5.5以降で有効になっています。Stackexchangeでこの回答を参照してください構成オプションをアクティブにする方法のについては、Stackexchangeで。
UPDATE 1 Gitバージョンの1.7 < v < 2.5
場合、「git clone」と「git reset」を使用します。 Vaibhav Bajpaiの回答でます。
完全なリポジトリを取得したくない場合は、おそらくを使用しないでください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
git fetch origin <sha1>
。タグやブランチ名などの名前付き参照を渡す必要があるようです。kerneltrap.org/mailarchive/git/2009/1/13/4707444を
git fetch origin <SHA1>
、リモートからマスターをフェッチしreset --hard
、ブランチをローカルで実際にインスタンス化した後、を使用して必要なリビジョンに切り替えることができることがわかりました。個々のリビジョンを直接取得することができませんでした。git 1.7では、git fetch origin <SHA1>
@ arturによって報告されたように機能しませんでした。をgit checkout <SHA1>
続けて使用する必要がありますreset --hard
。
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
再び最新のコミットに戻るには
$ git pull
--depth
ため、大規模なリポジトリにとって非常に重要な使用が可能になるため、実際の質問のIMHOには対応していません。このソリューションでは、すべてのオブジェクトをプルしてから、以前のリビジョンにリセットする必要があります。これは非常に時間がかかり、ネットワーク帯域幅を浪費します。
gitリポジトリを複製すると、リポジトリ全体が適切に複製されます。複製するリビジョンを1つだけ選択する方法はありません。ただし、を実行するとgit clone
、を実行して特定のリビジョンをチェックアウトできますcheckout <rev>
。
git clone --single-branch ...
1つの特定のコミットのみを複製するには特定のブランチまたはタグでには、以下を使用します。
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で動作します(私はversionで実行しました2.18.0
)。
最初から特定のポイントまですべてを取得したい場合は、Charles Baileyの回答が最適です。逆を行い、現在の日付からさかのぼって履歴のサブセットを取得したい場合git clone --depth [N]
は、Nが必要な履歴の回転数を使用できます。しかしながら:
-深さ
指定したリビジョン数に切り捨てられた履歴を持つ浅いクローンを作成します。浅いリポジトリにはいくつかの制限があります(クローンを作成したり、そこからフェッチしたり、そこからプッシュしたりすることはできません)が、長い歴史を持つ大規模プロジェクトの最近の履歴のみに関心があり、修正をパッチとして送信します。
要約すると(git v。1.7.2.1):
git clone
レポが欲しい場所でに実行します(日付までにすべてを取得します—私は知っています、何が望んでいるのではなく、私たちはそこに着いています) git checkout <sha1 rev>
あなたが望む回転のgit reset --hard
git checkout -b master
master
それに切り替える。
git reset --hard
?そのためのドキュメントには、「インデックスと作業ツリーをリセットします。作業ツリー内の追跡ファイルへの変更は<commit> [デフォルトはHEADになり、現在は<sha1 rev>
]なので破棄されます。」ただし、現時点ではクローン作成以降の変更はありません。その目的は何ですか。現在のブランチを切り捨て<sha1 rev>
ますか?
TL; DR-クローンを作成するコミットに対してソースリポジトリにタグを作成し、フェッチコマンドでタグを使用します。後で元のリポジトリからタグを削除してクリーンアップできます。
さて、その2014年とチャールズベイリーの2010年からの承認された回答は今では本当に古く、他の回答のほとんど(すべて?)はクローン作成に関するものであり、多くの人々はこれを避けたいと考えています。
次のソリューションは、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
うまくいけば、このソリューションはさらに数年間機能し続けます!:-)
簡単に使える git checkout <commit hash>
この順序で
bash
git clone [URLTORepository]
git checkout [commithash]
コミットハッシュは「45ef55ac20ce2389c9180658fdba35f4a663d204」のようになります
上記の回答のうち2つを使用する(特定のリビジョン/チェンジセットでgitリポジトリのクローンを作成する方法?および特定のリビジョン/チェンジセットでgitリポジトリのクローンを作成する方法?)ポイントまでクローンを作成する場合、そのポイントは単なるSHAではなくタグ/ブランチでなければならず、FETCH_HEADが混乱します。git fetchセットに続いて、ブランチまたはタグ名を使用すると、応答が返されます。SHA-1を単に使用すると、応答が返されません。
これが私がやったことです:-実際の元から、完全なリポジトリの完全に機能するクローンを作成します
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 origin_point リモート:オブジェクトのカウント:45493、完了。 リモート:オブジェクトの圧縮:100%(15928/15928)、完了。 リモート:合計45493(デルタ27508)、再利用45387(デルタ27463) オブジェクトの受信:100%(45493/45493)、53.64 MiB | 50.59 MiB /秒、完了。 デルタの解決: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
リモートでリモートで選択するために使用してorigin_pointからリポを再構築し、それを使用git push origin
してロット全体を新しいホームにアップロードすることができました。
誰かを助けることを願っています
git fetch local_copy origin_point
JamesGsとの違いは何 git fetch origin refs/tags/tmptag
ですか?
git fetch local_copy origin_point
空のreduced-repo
ディレクトリがある状態のままにします.git
。これらの指示に他に欠けているものがあります...
私のバージョンは、受け入れられた回答と最も賛成された回答の組み合わせでした。しかし、それは少し異なります。誰もが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>
git clone https://github.com/ORGANIZATION/repository.git
(リポジトリのクローンを作成)
cd repository (navigate to the repository)
git fetch origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
# clone special tag/branch without history
git clone --branch=<tag/branch> --depth=1 <repository>
# clone special revision with minimal histories
git clone --branch <branch> <repository> --shallow-since=yyyy-MM-ddTHH:mm:ss # get the commit time
cd <dir>
git reset --hard <revision>
uploadpack.allowReachableSHA1InWant=true
サーバー側で設定されていない場合、履歴なしでリビジョンを取得することはできませんが、そのためのタグを作成し、代わりに特別なタグを複製することができます。
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>
git
origin
広く知られている代わりに単語を使用しますrevision
以下はマニュアルからの抜粋です $ git help clone
--origin <name>, -o <name>
Instead of using the remote name origin to keep track of the upstream repository, use <name>.
--depth=1
回答で言及されていないので、ここで言及されていないものをさらに追加した場合、なぜこの回答はうまくいったと思いますか?問題が解決したことを嬉しく思いますが、この回答は誤解を招くものであり、一部でも質問に回答するものではありません。したがって、反対票。
git clone <url> <local_dir_name>
られます。自分で試してみてください。唯一の違いは、リモート(を使用して示されているgit remote
)は、慣習的な "origin"という名前ではなく、いくつかの不可解なsha1シーケンスと呼ばれることです。言い換えれば、<sha1-of-the-commit>
この回答で言及されていることは、サーバーからフェッチされたリビジョンやチェックアウトされるブランチには何の関係もありません。
git clone -o 896066ee1cf4d653057dac4e952f49c96ad16fa7 https://github.com/torvalds/linux.git linux --depth=1
。これは私に修正8a28d674
を与えます、そしてあなたとこの答えが主張するようにではありません 896066ee
。
git clone -b 10.1 https://github.com/MariaDB/server.git --depth=1 mariadb-server-src