Diferenças entre atualização remota e busca do git?


Respostas:


112

UPDATE: mais informações!

Eu deveria ter feito isso desde o início: eu cumprimentei as notas de lançamento do Git no repositório Git do Git (então meta!)

grep --color=always -R -C30 fetch Documentation/RelNotes/* | less

Depois fiz uma lesspesquisa --alle foi o que encontrei nas notas de lançamento do Git versão 1.6.6 :

git fetchaprendidas --alle --multipleopções, para executar a busca em muitos repositórios e --pruneopção para remover ramificações de rastreamento remoto que ficaram obsoletas. Estes tornam git remote updatee git remote prunemenos necessários (não há nenhum plano para remover remote updatenem remote prune, no entanto).

A versão 1.6.6 não foi lançada até 23 de dezembro de 2009 , e o Pôster original fez sua pergunta em 6 de dezembro de 2009.

Portanto, como você pode ver nas notas de versão, os autores do Git estavam cientes do fato de que a git remote updatefuncionalidade do comando estava sendo duplicada git fetch, mas eles decidiram não removê-la, talvez por compatibilidade com scripts e programas existentes, ou talvez porque é muito trabalho e há itens de prioridade mais alta.


Resposta original com mais detalhes

A resposta do xenoterracide já tem 3,5 anos e o Git passou por várias versões desde então (passou da v1.6.5.5 para a v1.8.3.2 até o momento em que este artigo foi escrito), e olhando a documentação atual para git remote updatee git fetch, parece como se ambos pudessem executar basicamente a mesma função de buscar novas confirmações de vários controles remotos , dadas as opções e argumentos corretos.

Buscando todos os controles remotos

Uma maneira de buscar vários controles remotos é com o --allsinalizador:

git fetch --all

Isso será buscado em todos os controles remotos configurados, supondo que você não tenha remote.<name>.skipFetchAlldefinido para eles:

Se verdadeiro, este controle remoto será ignorado por padrão ao atualizar usando git-fetch (1) ou o subcomando update de git-remote (1) . - documentação do git-config

Isso seria equivalente a usar

git remote update

sem especificar nenhum grupo remoto a ser buscado, e também sem ter remotes.defaultdefinido na configuração de repo, e também que nenhum de seus controles remotos foi remote.<name>.skipDefaultUpdatedefinido como true.

A documentação 1.8.3.2 atual para a configuração do Git não menciona a remotes.defaultconfiguração, mas consultei o Todo Poderoso Google sobre isso e encontrei esta explicação útil de Mislav Marohnić :

$ git config remotes.default 'origin mislav staging'
$ git remote update

# fetches remotes "origin", "mislav", and "staging"

Você pode definir uma lista padrão de controles remotos a serem buscados pelo remote updatecomando. Estes podem ser controles remotos de seus colegas de equipe, membros confiáveis ​​da comunidade de um projeto de código-fonte aberto ou similares.

Portanto, presumivelmente, se você remotes.defaultconfigurou e nem todos os seus controles remotos estão listados nele, git remote updatenão buscará todos os controles remotos dos quais seu repo está "ciente".

Quanto à remote.<name>.skipDefaultUpdateconfiguração, os documentos do Git explicam assim:

Se verdadeiro, este controle remoto será ignorado por padrão ao atualizar usando git-fetch (1) ou o subcomando update de git-remote (1) .

Buscando um grupo especificado de controles remotos

Em vez de buscar todos os controles remotos, ambos fetche remote updatepermitir que você especifique vários controles remotos e grupos de controles remotos a serem buscados:

git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]

git fetch [<options>] <group>permite buscar vários controles remotos que fazem parte de um grupo (para emprestar outro exemplo do Mislav ):

$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup

git fetch --multiplepermite especificar vários repositórios e grupos de repositórios para buscar de uma só vez ( nos documentos ):

Permitir que vários <repository>e <group>argumentos sejam especificados. Não <refspec>spode ser especificado.

Ambiguidade na git remote updatedocumentação

A sinopse paragit remote update especifica que a sintaxe do comando é a seguinte:

git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]

Observe a última parte [(<group> | <remote>)…]? Os pontos finais ...indicam que você pode especificar vários grupos e controles remotos com o comando, o que significa que ele se comporta da mesma maneira que git fetch --multiple... veja como a sintaxe entre os dois é tão semelhante?

No entanto, no mesmo documento, a explicação para o updatecomando não diz nada sobre a especificação de vários argumentos remotos e de grupo, apenas que

Busque [es] atualizações para um conjunto nomeado de controles remotos no repositório, conforme definido por remotes.<group>.

Portanto, não está claro se git remote updatefunciona de forma idêntica no que git fetch --multiplediz respeito à especificação de vários controles remotos individuais e vários grupos remotos.

Buscando um único controle remoto

Finalmente, todo mundo conhece o caso simples de buscar um único controle remoto:

git fetch <remote>

Pode ser que você também possa usar

git remote update <remote>

para fazer a mesma coisa, mas como mencionei na seção anterior, a documentação para git remote updatenão está clara sobre se é possível buscar algo diferente de um único grupo de controles remotos com o comando

Embrulhar

Como expliquei, git fetche git remote updatese comporta de maneira semelhante em relação à busca de vários controles remotos. Eles compartilham sintaxe e argumentos semelhantes, embora git fetchsejam mais curtos, portanto as pessoas provavelmente acham mais fácil digitar e usar.

Pode ser o caso que git remote updatenão pode ser usado para buscar apenas um único controle remoto git fetch, mas, como apontei, a documentação não deixa isso claro.

a parte, de lado

A duplicação na funcionalidade entre os comandos de porcelana Git, exemplificada por git fetche git remote updateacima, não é exclusiva. Eu notei uma situação semelhante com git rebase --ontoe git cherry-pick, em que ambos podem levar uma série de confirmações para corrigir uma nova confirmação básica.

Eu acho que, à medida que o Git evoluiu ao longo dos anos, algumas funcionalidades foram (inevitavelmente?) Duplicadas, talvez às vezes como uma conveniência para os usuários finais (por exemplo, é mais fácil passar um intervalo para cherry-pick, do que passar um único commit repetidamente) para escolher um intervalo). Aparentemente cherry-pick, nem sempre aceitamos uma série de confirmações, conforme explicado nas notas de versão v1.7.2 :

git cherry-pickaprendeu a escolher uma variedade de confirmações (por exemplo, cherry-pick A..Be cherry-pick --stdin), o mesmo fez git revert; eles não oferecem suporte ao controle de seqüenciamento mais agradável rebase [-i].


4
FYI: git rebaseé como mve git cherry-pické como cp. O --ontointerruptor não muda isso. Você pode obter um efeito de cópia git rebaseapenas se especificar valores SHA1, caso contrário, sua ramificação será movida!
Robert Siemer

141

Sim e não. git remote updatebusca de todos os controles remotos, não apenas um.

Sem olhar o código para ver se remote updateé apenas um script de shell (possível), basicamente, é executado a busca para cada controle remoto. git fetchpode ser muito mais granular.


3
Você pode configurar quais controles remotos buscar ao executar git remote update, consulte a página de manual do git-remote.
Jakub Narębski

Aliás, git remotenão é um script de shell, mas gera git fetchdurante a remote update.
Mipadi

1
Existe uma git fetchopção de comando equivalente para a git remote update?
Tule # 7/12

15
@tuler Sim: é #git fetch --all
LoKi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.