Git – setting up a remote repository and doing an initial push

There is a great deal of documentation and many posts on Git out there, so this is more of a note to self as I keep forgetting the steps needed to set up a remote repository and doing an initial “push”.
So, firstly setup the remote repository:


ssh git@example.com
mkdir my_project.git
cd my_project.git
git init --bare
git update-server-info # If planning to serve via HTTP
exit

On local machine:


cd my_project
git init
git add *
git commit -m "My initial commit message"
git remote add origin git@example.com:my_project.git
git push -u origin master

Done!
Team members can now clone and track the remote repository using the following:


git clone git@example.com:my_project.git
cd my_project

Bonus

To have your terminal prompt display what branch you are currently on in green, add the following to your ~/.bash_profile (I have my current directory displayed in cyan):


function git-branch-name {
  git symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3
}
function git-branch-prompt {
  local branch=`git-branch-name`
  if [ $branch ]; then printf " [%s]" $branch; fi
}
PS1="\u@\h \[\033[0;36m\]\W\[\033[0m\]\[\033[0;32m\]\$(git-branch-prompt)\[\033[0m\] \$ "

110 Replies to “Git – setting up a remote repository and doing an initial push”

  1. That is a great bonus tip! That little ~3 liner will save me countless (50, 60, who knows?!) gba (git branch all) calls in a day. I’ve actually trained myself that to ‘gba’ whenever I enter into a git directory to know which of the several branches I left myself in.
    I think you just made my evening…. and probably even my week. Thank you, thank you, thank you. 🙂

  2. Thanks for the good tip! I’ve been a Subversion guy for a long time and decided to give git a try for my latest project. I’m still not completely sold, but the info you’ve given has made the initial setup a bit easier.

  3. I beg your parden but can you clarify whether I need to create a user account “git” and makdir my_project.git in its home directory?
    (I presume that you mean that but it helps to state it.)

  4. Instead of requiring the git-track function that you have created, you can just do this instead:
    git push -u origin master
    The remote branch is then automatically tracked. Thanks for the help creating my remote repo though :o)

  5. In
    ssh git@example.com
    mkdir my_project.git
    cd my_project.git
    git init –bare
    git-update-server-info # If planning to serve via HTTP
    exit
    The server does not recognize “git-update-server-info” but does appear to accept “git update-server-info”
    When I try the second paragraph,
    “git push origin master”
    I get:
    ! [remote rejected] master -> master (branch is currently checked out)
    Any ideas? Why is it trying to push “master” when I’m telling it “origin”?
    I even logged back into my server and try to create a branch called “origin”, it returns
    $git branch origin
    fatal: Not a valid object name: ‘master’.
    Also tried to commit (since it said “branch is currently checked out”) and I got this
    $git commit -a
    fatal: This operation must be run in a work tree
    Thanks

  6. Thanks for the “push -u” pointer @frak! I had figured out how to do:
    “git push –all origin” and then
    “git branch –set-upstream master origin/master”
    — I didn’t realize you could combine the two as
    “git push -u –all origin”

  7. Thanks for the tips
    My situation: local branch in my laptop, cloned from origin git repo. On same git repo cloned on an other host. I want to see the git log on this host from my latopop:
    > git remote add myTag ssh://user@host:/path/to/git/repo
    > # Log of origin ok
    > git log -n 5 origin
    > But not on remote host
    > git log -n 5 myTag
    > fatal: ambiguous argument ‘myTag’: unknown revision or path not in the working tree.
    > Use ‘–‘ to separate paths from revisions

    1. I would be inclined to to a gig log to show recent commits, then git checkout [the hash of the commit to go back to]. Then commit these changes to master and push.

  8. So I did everything as you said, but when I push something to my remote repository from my local machine, there’s nothing in the remote repository although the push itself seems to be a success. Master-branch is the only branch on the remote repo and there’s nothing I pushed there. What am I doing wrong?

    1. @Damnit The instructions are to setup a bare repository on the remote machine, this means that there will be no working copy and everything is stored within the ‘.git’ repository directory. If you try cloning the remote repo with ‘git clone user@host:repo.git’, you will most likely find it works as expected.
      If you want the remote machine to have a working copy, just leave off the ‘–bare’ option when initialising the repo. Hope this helps.

  9. Hi,
    I new to git now i can push to the local machine but how to push to the another machine. and
    what is example.com in
    ssh git@example.com
    mkdir my_project.git
    cd my_project.git
    git init –bare
    git update-server-info # If planning to serve via HTTP
    exit

    1. In the example, example.com is a domain name pointing to the server you wish to push to. This could just as easily be an IP address.
      The example also assumes a ‘git’ user, so using an IP address you’d end up with something like: ‘ssh git@1.2.3.4’.

  10. Pingback: my git reminder
  11. Make sure the git user and group owns the repository directory on the remote. If it doesn’t, use the chown command to make the proper changes.

  12. Ah, you have to create the remote project first. I skipped that step thinking it would be created automatically with the first push. Of course, it took a few more dead ends to figure out how to get everything in sync again since the remote repository was created after the local one.
    It’s not difficult, just a little confusing figuring it out.
    It would be helpful to update the post for anyone who might make the same mistake. 😉
    Thanks for the tip!

  13. Hi,
    I am trying the following and getting the request to enter password. Which password is this ? I am not able to log in with the password which I used for the server at bootup.
    sudo git push -u origin master
    git@192.168.1.81‘s password:
    Syed

  14. Hi,
    I am gettting the following error . The only difference in steps is that I had to use “git add .” instead of “git add *”.
    mohsin@KubuntuVM:~/my_project$ sudo git push -u origin master
    error: src refspec master does not match any.
    error: failed to push some refs to ‘git@192.168.1.81:/opt/my_project.git’
    Mohsin

  15. Hi Jamie,
    I think the error comes when you have no files in my_project. Once I added a file to my_project/ and repeated the procedure it all worked.
    One final question on terminal prompt displaying what branch you are currently on.
    I am using Kubuntu and could not find ~/.bash_profile file. I only have ~/.profile. Do we have to add the code to the ~/.profile ?
    Also, are any changes required or just copy the exact code ? I am asking because, I did add the lines to my .profile and could not login the next time.
    Thanks,
    Mohsin

  16. This was really great thank you, first time getting into git today and I found this very helpful! Great resource for a learner and well explained, consider yourself bookmarked!
    Thanks 😀

  17. Fantastic, really quick to pick up. Just one thing – I had to put a ‘/’ in front of the path to the *.git folder on the server e.g.
    git remote add origin git@example.com:/y_project.git
    Cheers!

  18. Thanks for putting this up. I find myself searching every time I need to do this, and the last couple times have ended up here. Cheers.

  19. There is a great deal of documentation and many posts on Git out there, so this is more of a note to self

    And yet, this was the first google entry for the search “git push to new remote repository”. Congrats.

  20. Thank you for the write-up — it put me on the right track. Please consider updating your write-up to include an explanation of the post-receive hook and how to implement this and where to save it — something like this:
    Create a file post-receive in the hooks directory of your repository:
    #!/bin/sh
    GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f
    Make sure the target directory exists, as Git won’t create it for you. Finally, set permissions on the file:
    $ chmod +x hooks/post-receive

  21. What I like about this article is that it is simple, to the point, and has none of the the cruft a lot of other tuts on the same subject have. Brilliant!

  22. Dear Lucid,
    do not assume anything. If something can go wrong it will definitely go wrong and it always goes wrong.
    You could add a few lines when explaining how to set up the initial repository on the remote server, stating with CAPITALS that:
    YOU GUYS NEED FIRST TO CREATE A git USER give it a password which you are going to share with your friends and use the following command for permissions or whatever.
    Otherwise people are confused.

  23. Hi, first thank you for your instructions, Git is going difficult to me.
    I follow your steps carefully but when finally I push my local files to the remote bare repository it looks like run well, I meen I took a bit time but the files are not sent to the remote server project folder???
    It is necesary to push there by using FTP??
    Thanks in advance!!
    Rubén

  24. Thanks a lot.
    Also, you should run git init --bare with --shared parameter if you are using central git repository with team:

    $ git init --bare --shared foo.git
    Initialized empty shared Git repository in /git/foo.git/
    $ chgrp -R devteam foo.git

  25. I’m used to doing to contribute to repositories but for some reason is missed out in the bitbucket instructions for how to push your first commit – thought perhaps the ‘git remote add origin git@bitbucket.

Leave a Reply

Your email address will not be published. Required fields are marked *