¿Cómo agregar de forma permanente la location de origen a git repo?

Una de las molestias de git es tener que usar git remote add upstream URL para cada clon que realizo de un repository que se bifurca desde algún repository upstream (como las horquillas Github). Idealmente, debería ser capaz de almacenar la location stream arriba en el repository bifurcado para que todos los clones lo configuren automáticamente. ¿Hay alguna manera de lograr esto usando git?

En lo que respecta a Git, no existe un vínculo entre el repository original (es decir, el repository desde el que se bifurcó) y un clon de su tenedor; no hay información sobre la URL del primero en este último. Por lo tanto, de una forma u otra, debe agregar el repository original como un control remoto del clon luego de la clonación.

Para automatizar las cosas un poco y evitar tener que escribir URL cada vez, puede definir un alias para cada proyecto desde el que ha bifurcado:

 git config alias.remaddfoo "remote add upstream <URL-of-original-project-foo>" 

Después de clonar tu tenedor, deberías hacer un cd dentro del nuevo clon y recordar invocar el alias correspondiente.

Llevar la automation un paso más allá implicaría escribir algún tipo de envoltorio alnetworkingedor git clone que se cd automáticamente dentro del clon y ejecutar git remote add... , pero analizar los arguments de git clone correctamente puede ser un poco complicado.

Como dicen otras respuestas, git no tiene actualmente funcionalidad incorporada para vincular los repos.

Por lo tanto, escribí un pequeño script de Python llamado clone que usa BeatifulSoup 4 para analizar el repository upstream para BitBucket y GitHub y agregarlo como un control remoto llamado en upstream . Esto funciona tanto para git como para Mercurial. Está alojado en GitHub , pero para completarlo incluyo el script completo en esta respuesta:

 #! /usr/bin/env python3 description=''' A wrapper for repo cloning commands for various DVCS. Automatically adds the upstream URL when cloning a forked repo from popular DVCS web hosts. Currently supports: (DVCS: git, Mercurial) (hosts: GitHub, Bitbucket) ''' # Created by Jesse Johnson aka holocronweaver (2014-10-08). import argparse import re import subprocess import urllib.request from bs4 import BeautifulSoup def find(regex, string, errorMessage): '''Return value at regex, or else print error message and exit program.''' m = re.search(regex, string) if (m): return m.group(1) else: print('Error:', errorMessage) exit() parser = argparse.ArgumentParser(description=description) parser.add_argument('origin', metavar='O', type=str, help='the SSH URL of origin repo, optionally' 'followed by its destination folder') args = parser.parse_args() # Parse destination. splitArgs = re.split('\s+', args.origin) if len(splitArgs) > 1: origin = splitArgs[0] destination = splitArgs[1] else: origin = args.origin destination = find('@.*\.\w+[:|/].*/(.*)[.git]?$', origin, 'Error: Could not parse destination folder from origin URL.') destination = re.sub('\.git', '', destination) print('destination folder:', destination) # Unfortunately HTTPS URLs do not contain enough info to clarify which # DVCS is being used, so SSH is easiest to support. vcs = find('^[ssh://]?(.*)@', origin, 'URL does not contain SSH user (eg, git@ or hg@).') print('version control system:', vcs) domain = find('@(.*\.\w+)[:|/]', origin, 'Error: Could not parse domain from origin URL.') print('domain:', domain) path = find('@.*\.\w+([:|/].*)[.git]?$', origin, 'Error: Could not parse repo path from origin URL.') path = re.sub(':', '/', path) print('repo path:', path) homepage = 'https://' + domain + path print(homepage) data = urllib.request.urlopen(homepage).read() soup = BeautifulSoup(data) # Version control system specifics. if ('git@' in origin): ext = '.git' clone = 'git clone %s %s' setUpstream = 'git remote add upstream %s' elif ('hg@' in origin): ext = '' clone = 'hg clone %s %s' setUpstream = 'echo "upstream = %s \n" >> .hg/hgrc' else: print('Error: Version control system not supported.') exit() upstream = None if ('github.com' in origin): element = soup.find('span', class_='fork-flag') if element: upstreamBase = element.span.a['href'] upstream = 'https://github.com' + upstreamBase + ext elif ('bitbucket.org' in origin): element = soup.find('a', class_='fork-of') if element: upstreamBase = element['href'] upstream = 'https://bitbucket.org' + upstreamBase + ext else: print('Warning: Web host not supported.') print('Warning: Continuing to clone without adding upstream repo.') print(upstream) subprocess.Popen(clone % (origin, destination), shell=True).wait() if upstream: subprocess.Popen(setUpstream % upstream, cwd=destination, shell=True).wait() 

Por defecto, git clone llama a su "origen" remoto. Si quieres que se llame algo más, usa

 git clone -o upstream <path_to_repo> 

Git Clone

 --origin <name> -o <name> Instead of using the remote name origin to keep track of the upstream repository, use <name>. 

EDITAR: Para su caso de necesitar seguir el control remoto de un control remoto … nunca he encontrado una buena manera de hacer esto. Puedes escribir un wrapper alnetworkingedor de git clone , pero tiene que estar codificado para cada repository.