Comment ajouter un référentiel local et le traiter comme un référentiel distant

234

J'essaie de faire en sorte qu'un référentiel local agisse comme une télécommande avec le nom bakd'un autre référentiel local sur mon PC, en utilisant ce qui suit:

git remote add /home/sas/dev/apps/smx/repo/bak/ontologybackend/.git bak

ce qui donne cette erreur:

fatal: '/home/sas/dev/apps/smx/repo/bak/ontologybackend/.git' is not a valid remote name

J'essaie de synchroniser deux dépôts locaux, l'un configuré comme une télécommande nommée bakpour l'autre, puis en émettant git pull bak.

Quelle est la meilleure façon de procéder?


Éditer:

Désolé, idiot, je viens de réaliser que l'ajout à distance devrait être:

git remote add bak /home/sas/dev/apps/smx/repo/bak/ontologybackend/.git

le nom de la télécommande précède l'adresse.

opensas
la source

Réponses:

273

Vous avez vos arguments à la remote addcommande inversés:

git remote add <NAME> <PATH>

Alors:

git remote add bak /home/sas/dev/apps/smx/repo/bak/ontologybackend/.git

Voir git remote --helppour plus d'informations.

larsks
la source
6
La .gitfin est-elle spécifiquement requise cependant?
Erik Aigner
5
C'est juste un chemin ... Git se fiche de son nom.
larsks
2
@ErikAigner traditionnellement, les dépôts nus se terminent par un suffixe ".git". Bien que généralement pas comme son propre répertoire, mais plutôt comme: "/path/to/projectname.git". - En dehors de cela, cela ne fait aucune différence.
Atli le
7
Il semble que vous devez utiliser un chemin absolu, ce qui n'était pas évident pour moi. Quand j'ai essayé avec un chemin relatif, j'ai réussi fatal: '../dir' does not appear to be a git repository.
Keith Layne
1
Il est important de mettre file://en avant du chemin et d'utiliser le chemin complet vers le référentiel local afin que le logiciel client puisse y accéder via le protocole attendu. Et en réponse à la question d'Erik ci-dessus, .gitla fin du chemin est apparemment nécessaire.
Scott Lahteine
158

Si votre objectif est de conserver une copie locale du référentiel pour une sauvegarde facile ou pour coller sur un disque externe ou partager via le stockage cloud (Dropbox, etc.), vous pouvez utiliser un référentiel nu . Cela vous permet de créer une copie du référentiel sans répertoire de travail, optimisée pour le partage.

Par exemple:

$ git init --bare ~/repos/myproject.git
$ cd /path/to/existing/repo
$ git remote add origin ~/repos/myproject.git
$ git push origin master

De même, vous pouvez cloner comme s'il s'agissait d'un dépôt à distance:

$ git clone ~/repos/myproject.git
Matt Sanders
la source
9
Cela devrait être la réponse acceptée, car elle correspond parfaitement à la question "Quel est le meilleur moyen d'y parvenir?". Le "dépôt local traité comme un dépôt distant", comme l'appelait @opensas, est en effet un répertoire nu (tout comme un véritable référentiel distant)
Jack
1
Je suggère une modification: si vous devez utiliser "git remot add .." + "git push" ou simplement "git clone" est indiqué ici: stackoverflow.com/a/31590993/5446285 (réponse d'Adelphus)
Jack
1
@Jack - pouvez-vous expliquer ce que vous avez trouvé déroutant? Je suis heureux de modifier, mais je souhaite que la réponse soit relativement succincte.
Matt Sanders
6

Il semble que votre format soit incorrect:

Si vous souhaitez partager un référentiel créé localement, ou si vous souhaitez recevoir des contributions d'un référentiel elses de quelqu'un - si vous souhaitez interagir de quelque manière que ce soit avec un nouveau référentiel, il est généralement plus facile de l'ajouter en tant que référentiel. Pour ce faire, exécutez git remote add [alias] [url]. Cela ajoute [url] sous une télécommande locale nommée [alias].

#example
$ git remote
$ git remote add github [email protected]:schacon/hw.git
$ git remote -v

http://gitref.org/remotes/#remote

Kristian
la source
0

Je publie cette réponse pour fournir un script avec des explications qui couvre trois scénarios différents de création d'un référentiel local doté d'une télécommande locale. Vous pouvez exécuter l'intégralité du script et il créera les dépôts de test dans votre dossier de départ (testé sur windows git bash). Les explications sont à l'intérieur du script pour une sauvegarde plus facile dans vos notes personnelles, son très lisible à partir, par exemple Visual Studio Code.

Je voudrais également remercier Jack pour le lien vers cette réponseadelphus a de bonnes explications pratiques sur le sujet.

Ceci est mon premier message ici, alors veuillez conseiller ce qui devrait être amélioré.

## SETUP LOCAL GIT REPO WITH A LOCAL REMOTE
# the main elements:
# - remote repo must be initialized with --bare parameter
# - local repo must be initialized
# - local repo must have at least one commit that properly initializes a branch(root of the commit tree)
# - local repo needs to have a remote
# - local repo branch must have an upstream branch on the remote

{ # the brackets are optional, they allow to copy paste into terminal and run entire thing without interruptions, run without them to see which cmd outputs what

cd ~
rm -rf ~/test_git_local_repo/

## Option A - clean slate - you have nothing yet

mkdir -p ~/test_git_local_repo/option_a ; cd ~/test_git_local_repo/option_a
git init --bare local_remote.git # first setup the local remote
git clone local_remote.git local_repo # creates a local repo in dir local_repo
cd ~/test_git_local_repo/option_a/local_repo
git remote -v show origin # see that git clone has configured the tracking
touch README.md ; git add . ; git commit -m "initial commit on master" # properly init master
git push origin master # now have a fully functional setup, -u not needed, git clone does this for you

# check all is set-up correctly
git pull # check you can pull
git branch -avv # see local branches and their respective remote upstream branches with the initial commit
git remote -v show origin # see all branches are set to pull and push to remote
git log --oneline --graph --decorate --all # see all commits and branches tips point to the same commits for both local and remote

## Option B - you already have a local git repo and you want to connect it to a local remote

mkdir -p ~/test_git_local_repo/option_b ; cd ~/test_git_local_repo/option_b
git init --bare local_remote.git # first setup the local remote

# simulate a pre-existing git local repo you want to connect with the local remote
mkdir local_repo ; cd local_repo
git init # if not yet a git repo
touch README.md ; git add . ; git commit -m "initial commit on master" # properly init master
git checkout -b develop ; touch fileB ; git add . ; git commit -m "add fileB on develop" # create develop and fake change

# connect with local remote
cd ~/test_git_local_repo/option_b/local_repo
git remote add origin ~/test_git_local_repo/option_b/local_remote.git
git remote -v show origin # at this point you can see that there is no the tracking configured (unlike with git clone), so you need to push with -u
git push -u origin master # -u to set upstream
git push -u origin develop # -u to set upstream; need to run this for every other branch you already have in the project

# check all is set-up correctly
git pull # check you can pull
git branch -avv # see local branch(es) and its remote upstream with the initial commit
git remote -v show origin # see all remote branches are set to pull and push to remote
git log --oneline --graph --decorate --all # see all commits and branches tips point to the same commits for both local and remote

## Option C - you already have a directory with some files and you want it to be a git repo with a local remote

mkdir -p ~/test_git_local_repo/option_c ; cd ~/test_git_local_repo/option_c
git init --bare local_remote.git # first setup the local remote

# simulate a pre-existing directory with some files
mkdir local_repo ; cd local_repo ; touch README.md fileB

# make a pre-existing directory a git repo and connect it with local remote
cd ~/test_git_local_repo/option_c/local_repo
git init
git add . ; git commit -m "inital commit on master" # properly init master
git remote add origin ~/test_git_local_repo/option_c/local_remote.git
git remote -v show origin # see there is no the tracking configured (unlike with git clone), so you need to push with -u
git push -u origin master # -u to set upstream

# check all is set-up correctly
git pull # check you can pull
git branch -avv # see local branch and its remote upstream with the initial commit
git remote -v show origin # see all remote branches are set to pull and push to remote
git log --oneline --graph --decorate --all # see all commits and branches tips point to the same commits for both local and remote
}

Jarek
la source