git clone from local to remote

2019-01-31 01:32发布

We're in the process of migrating from Mercurial to Git for our workflow and I have two minor issues.

First, is it possible to "clone" a local repository directly into an empty remote (ssh) dir?

Currently when we create a new website we basically clone our CMS locally, configure it and then we clone it on the central repo and on the webserver (hg clone . ssh://account@server/www). That way we have instant access to push/pull goodness.

This brings me to the second issue, remote deployment.

Currently with Mercurial, I have a simple hooks in the remote repos that execute hg up when a changeset is received.

To do the same with Git I've followed the instructions here: http://caiustheory.com/automatically-deploying-website-from-remote-git-repository but I'd like to keep the .git directory in the website root as it is the case with Mercurial (it's protected by Apache config and I can't export GIT_DIR for all accounts as some have more than one website/repos).

Is it possible to have basically the same setup without separating the working dir from the repos?

6条回答
太酷不给撩
2楼-- · 2019-01-31 02:01

This answer is good but I was not able to get it to work for me. The following code from this link did http://thelucid.com/2008/12/02/git-setting-up-a-remote-repository-and-doing-an-initial-push/. On the remote run

mkdir my_project.git
cd my_project.git
git init --bare
git-update-server-info # If planning to serve via HTTP

Locally on an existing repository that already has at least one commit run

git remote add origin git@example.com:my_project.git
git push -u origin master

I hope this helps anyone that had problems with the other answer.

查看更多
We Are One
3楼-- · 2019-01-31 02:02

Just to give you an alternative, you can use:

git remote set-url origin git://other.url.here

These also work if your local git respository is pointing to another remote repository

查看更多
Animai°情兽
4楼-- · 2019-01-31 02:04

Easiest git equivalent to hg clone . ssh://account@server/www is:

rsync -avz . ssh://account@server/www/reponame

In fact, I have added this line to ~/.bash_aliases to mirror any directory anywhere:

alias mirror="rsync -avz . ssh://account@server`pwd` --delete"

It could prove dangerous if you happen to be in a special directory like /dev or /bin. Be careful.

查看更多
成全新的幸福
5楼-- · 2019-01-31 02:06

I agree with, and improve on presto8 by deleting unmatched files.

rsync -avz . ssh://account@server/www/reponame --delete
查看更多
爷、活的狠高调
6楼-- · 2019-01-31 02:10

To answer your first question, yes, you can. Suppose the remote directory is ssh://user@host/home/user/repo. This must be a git repository, create that with git init --bare or scp your local repo.git (can be created with git clone) directory to remote. Then do:

git remote add origin ssh://user@host/home/user/repo
git push --all origin

This will push all locally-existing branches to the remote repository.

To get to your next question, you should be able to do the same thing by using a different set of commands. Try these:

$ cd /var/www  # or wherever
$ mkdir somesite
$ cd somesite/
$ git init
$ git --bare update-server-info
$ git config receive.denycurrentbranch ignore
$ cat > hooks/post-receive
#!/bin/sh
git checkout -f
^D
$ chmod +x hooks/post-receive

You would, of course, run the remote/push commands above after this step. You may have to check out a specific branch after doing so, so that the "somesite" clone on the server actually knows which branch to follow. From then on out, pushing to that repository should trigger a re-checkout of that branch.

查看更多
Lonely孤独者°
7楼-- · 2019-01-31 02:15

I also ran into this issue recently and solved it as follows:

On remote server:

1: Create a directory named /tmp/bare
2: Change to that directory
3: Execute git init --bare

On local machine:

1: Change to your git project directory
2: git remote add bare ssh://user@server/tmp/bare
3: git push --all bare
4: git remote remove bare

On remote server:

1: git clone /tmp/bare /path/to/your/clone

On local machine:

1: git remote add origin ssh://user@server/path/to/your/clone

This is a little involved, but it works and does not require setting any weird flags or instructing git to override its default behaviours. It is hence quite safe.

查看更多
登录 后发表回答