Como posso clonar o repositório git com revisão específica, algo como normalmente faço no Mercurial:
hg clone -r 3 /path/to/repository
Como posso clonar o repositório git com revisão específica, algo como normalmente faço no Mercurial:
hg clone -r 3 /path/to/repository
Respostas:
ATUALIZAÇÃO 2 Desde o Git 2.5.0, o recurso descrito abaixo pode ser ativado no lado do servidor com variável de configuração uploadpack.allowReachableSHA1InWant
, aqui a solicitação do recurso GitHub e o GitHub confirmam a ativação desse recurso . Observe que alguns servidores Git ativam essa opção por padrão, por exemplo, o Bitbucket Server a ativou desde a versão 5.5+ . Veja esta resposta no Stackexchange para um exemplo de como ativar a opção de configuração.
ATUALIZAÇÃO 1 Para versões Git, 1.7 < v < 2.5
use git clone e git reset, conforme descrito na resposta de Vaibhav Bajpai
Se você não deseja buscar o repositório completo, provavelmente não deve usá-lo clone
. Você sempre pode usar a busca para escolher a ramificação que deseja buscar. Eu não sou um especialista em hg, então não sei os detalhes, -r
mas no git você pode fazer algo assim.
# 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>
funciona; parece que você precisa passar uma referência nomeada, como uma marca ou nome de filial. Veja kerneltrap.org/mailarchive/git/2009/1/13/4707444
git fetch origin <SHA1>
para alternar para qualquer revisão que desejava, depois de buscar o mestre no controle remoto e fazer isso reset --hard
para instanciar a ramificação localmente. Não pude buscar diretamente as revisões individuais. Com o git 1.7, git fetch origin <SHA1>
não funcionou, conforme relatado pelo @artur; você precisa usar git checkout <SHA1>
seguido de a reset --hard
.
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
Para voltar novamente ao commit mais recente
$ git pull
--depth
que é muito importante para grandes repositórios. Esta solução requer puxar todos os objetos e redefinir para uma revisão anterior. Isso consome muito tempo e desperdiça largura de banda da rede.
A clonagem de um repositório git, apropriadamente, clona o repositório inteiro: não há como selecionar apenas uma revisão para clonar. No entanto, depois de executar git clone
, você pode fazer o check-out de uma revisão específica fazendo isso checkout <rev>
.
git clone
agarra o repositório inteiro. Depois de obtê-lo, você poderá fazer o checkout de uma revisão específica.
git clone --single-branch ...
Para clonar apenas um único commit específico em uma ramificação ou marca específica, use:
git clone --depth=1 --branch NAME https://github.com/your/repo.git
Infelizmente, NAME
só pode ser o nome do ramo ou o nome da marca (não confirma o SHA).
Omita a --depth
bandeira para fazer o download de todo o histórico e faça check-out dessa ramificação ou tag:
git clone --branch NAME https://github.com/your/repo.git
Isso funciona com a versão recente do git (eu fiz isso com a versão 2.18.0
).
Se você quer buscar tudo, desde o início até um ponto específico, a resposta de Charles Bailey é perfeita. Se você deseja fazer o inverso e recuperar um subconjunto do histórico desde a data atual, você pode usar git clone --depth [N]
onde N é o número de rotações do histórico que deseja. Contudo:
--profundidade
Crie um clone superficial com um histórico truncado para o número especificado de revisões. Um repositório superficial tem várias limitações (você não pode clonar ou buscar dele, nem empurrá-lo nem empurrá-lo), mas é adequado se você estiver interessado apenas no histórico recente de um grande projeto com um longo histórico e desejar envie correções como patches.
Apenas para resumir as coisas (git v. 1.7.2.1):
git clone
onde você quer o repo (deixa tudo atualizado - eu sei, não o que é desejado, estamos chegando lá) git checkout <sha1 rev>
da rev que você quergit reset --hard
git checkout -b master
master
e muda para ele.
git reset --hard
? Os documentos para isso dizem "Redefine o índice e a árvore de trabalho. Quaisquer alterações nos arquivos rastreados na árvore de trabalho desde que <commit> [cujo padrão é HEAD, que agora é <sha1 rev>
] são descartadas". Mas neste momento não fizemos nenhuma alteração desde a clonagem, então qual é o objetivo? Trunca a ramificação atual em <sha1 rev>
?
TL; DR - Basta criar uma tag no repositório de origem contra a confirmação que você deseja clonar e usar a tag no comando buscar. Você pode excluir a tag do repositório original posteriormente para limpar.
Bem, em 2014 e parece que a resposta aceita por Charles Bailey a partir de 2010 está bem e verdadeiramente desatualizada agora e a maioria (todas?) Das outras respostas envolve clonagem, o que muitas pessoas esperam evitar.
A solução a seguir alcança o que o OP e muitos outros estão procurando, que é uma maneira de criar uma cópia de um repositório, incluindo histórico, mas apenas até um determinado commit.
Aqui estão os comandos que usei com o git versão 2.1.2 para clonar um repositório local (por exemplo, um repositório em outro diretório) até um certo ponto:
# 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
Esperamos que esta solução continue funcionando por mais alguns anos! :-)
Você pode usar simplesmente git checkout <commit hash>
nesta sequência
bash
git clone [URLTORepository]
git checkout [commithash]
o hash de confirmação tem esta aparência "45ef55ac20ce2389c9180658fdba35f4a663d204"
O uso de 2 das respostas acima ( como clonar repositório git com revisão / conjunto de alterações específico? E como clonar repositório git com revisão / conjunto de alterações específico? ) Me ajudou a criar uma definição. Se você deseja clonar até um ponto, esse ponto deve ser uma marca / ramificação, não apenas um SHA ou o FETCH_HEAD fica confuso. Após o conjunto de busca git, se você usar um nome de filial ou marca, obterá uma resposta; se você simplesmente usar um SHA-1, não obterá resposta.
Aqui está o que eu fiz: - criar um clone completo do repositório completo, a partir da origem real
cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git
Em seguida, crie uma filial local, no ponto que for interessante
git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point
Em seguida, crie meu novo repositório em branco, com minha cópia local como origem
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
Nesse ponto, eu recebi essa resposta. Notei isso porque se você usar um SHA-1 no lugar do ramo acima, nada acontece, então a resposta significa que funcionou
/ var / www / html / ui-hacking $ git fetch local_copy origin_point remote: Contando objetos: 45493, concluído. remote: Compactando objetos: 100% (15928/15928), concluído. remoto: Total 45493 (delta 27508), reutilizado 45387 (delta 27463) Objetos de recebimento: 100% (45493/45493), 53,64 MiB | 50,59 MiB / s, concluído. Resolução de deltas: 100% (27508/27508), concluído. De / var / www / html / ui * ponto de origem da ramificação -> FETCH_HEAD * [novo ramo] ponto de origem -> ponto de origem / origem
Agora, no meu caso, eu precisava colocar isso de volta no gitlab, como um novo repositório.
git remote add origin git@<our gitlab server>:ui-developers/new-ui.git
O que significava que eu poderia reconstruir meu repositório a partir do origin_point usando o git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k
cherry pick remotamente e depois usar o git push origin
upload de todo o lote de volta para sua nova casa.
Espero que ajude alguém
git fetch local_copy origin_point
difere do JamesGs git fetch origin refs/tags/tmptag
?
git fetch local_copy origin_point
deixa em um estado com um reduced-repo
diretório vazio , contendo apenas um .git
. Há outra coisa que faltava para estas instruções ...
Minha versão foi uma combinação de respostas aceitas e mais votadas. Mas é um pouco diferente, porque todo mundo usa SHA1, mas ninguém diz como obtê-lo
$ git init
$ git remote add <remote_url>
$ git fetch --all
agora você pode ver todas as filiais e confirmações
$ git branch -a
$ git log remotes/origin/master <-- or any other branch
Finalmente, você conhece o SHA1 da confirmação desejada
git reset --hard <sha1>
Eu uso esse trecho com o GNU make para fechar qualquer tag de revisão, ramificação ou hash
foi testado na versão 2.17.1 do git
${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 $@
git clone https://github.com/ORGANIZATION/repository.git
(clone o repositório)
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>
você não pode obter uma revisão sem históricos se não estiver definido uploadpack.allowReachableSHA1InWant=true
no lado do servidor, enquanto pode criar uma tag para ela e clonar a tag especial.
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>
git
usa a palavra origin
em vez de popularmente conhecidorevision
A seguir, um trecho do manual $ 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
não é mencionado na resposta, então por que você diria que essa resposta funcionou se você adicionou mais itens que não foram mencionados aqui? Estou feliz que tenha funcionado para você, mas essa resposta é enganosa e não responde à pergunta, mesmo em parte. Daí os votos negativos.
git clone <url> <local_dir_name>
, tente você mesmo. A única diferença é que o controle remoto (mostrado usando git remote
) será chamado de sequência sha1 enigmática em vez do nome "origem" que é habitual. Em outras palavras, o <sha1-of-the-commit>
mencionado nesta resposta não tem qualquer influência sobre quais revisões são buscadas no servidor ou qual filial será retirada.
git clone -o 896066ee1cf4d653057dac4e952f49c96ad16fa7 https://github.com/torvalds/linux.git linux --depth=1
. Isso me dá uma revisão 8a28d674
e não 896066ee
como você e esta resposta afirma.
git clone -b 10.1 https://github.com/MariaDB/server.git --depth=1 mariadb-server-src