04 May 2013

最近把这段时间写的代码push到heroku时出现了问题,运行git push后一直没有响应,后来发现git pull --rebase也是没有响应,一直没找到原因。因为不想代码总在本地放着,所以想把代码存放在github和heroku两个地方,平时向github提交,开发到一定阶段再push到heroku。


下面将一步步的进行操作:

  • 建立一个空的git repositoy作为我们的working directory:

      ➜  git-demo  git init local
      Initialized empty Git repository in ~/workspace/git-demo/local/.git/
      ➜  git-demo  cd local
    
  • 添加文件readme.md,并提交到本地:

      ➜  local git:(master) touch readme.md
      ➜  local git:(master) git add .      
      ➜  local git:(master) git commit -m "qszhuan: Add readme file"
    
  • 在本地文件系统中创建一个git repository作为remote repository,叫做github:

      ➜  git-demo  ls
      local
      ➜  git-demo  git init github --bare
      Initialized empty Git repository in ~/workspace/git-demo/github/
    
  • 类似的,在本地文件系统创建另一个remote repository, 叫做heroku:

      ➜  git-demo  git init heroku --bare
      Initialized empty Git repository in ~/workspace/git-demo/heroku/
      ➜  git-demo  ls 
      github heroku local
      ➜  git-demo  
    
  • 将local中的代码提交到github仓库:

      ➜  local git:(master) git remote add origin ~/workspace/git-demo/github
      ➜  local git:(master) git push origin master
      Counting objects: 3, done.
      Writing objects: 100% (3/3), 230 bytes, done.
      Total 3 (delta 0), reused 0 (delta 0)
      Unpacking objects: 100% (3/3), done.
      To ~/workspace/git-demo/github
      * [new branch]      master -> master
    
  • 此时我们看local/.git/config文件,多了一项配置:

      [remote "origin"]
      url = ~/workspace/git-demo/github
      fetch = +refs/heads/*:refs/remotes/origin/*   这是我们执行`git remote add`的结果。
    
  • 同样,如果我们想把代码提交到heroku,那么需要再添加一个remote ’heroku‘并提交代码到这个remote就行了:

      ➜  local git:(master) git remote add heroku ~/workspace/git-demo/heroku
      ➜  local git:(master) git push heroku master
      Counting objects: 3, done.
      Writing objects: 100% (3/3), 230 bytes, done.
      Total 3 (delta 0), reused 0 (delta 0)
      Unpacking objects: 100% (3/3), done.
      To ~/workspace/git-demo/heroku
       * [new branch]      master -> master
      ➜  local git:(master) 
    

    再查看config文件,多了一项:

      [remote "heroku"]
      url = ~/workspace/git-demo/heroku
      fetch = +refs/heads/*:refs/remotes/heroku/*
    

    通过git命令查看所有remote:

      ➜  local git:(master) git remote -v
      heroku	~/workspace/git-demo/heroku (fetch)
      heroku	~/workspace/git-demo/heroku (push)
      origin	~/workspace/git-demo/github (fetch)
      origin	~/workspace/git-demo/github (push)
    
  • 如果我们想在一次push时把代码提交到github的同时也提交到heroku,那么可以添加一个push的url到origin:

      ➜  local git:(master) git remote set-url --add --push origin ~/workspace/git-demo/github
      ➜  local git:(master) git remote set-url --add --push origin ~/workspace/git-demo/heroku
    

    这样在git push的时候会把代码提交到两个remote repositories。

    查看config文件:

      [remote "origin"]
      	url = ~/workspace/git-demo/github
      	fetch = +refs/heads/*:refs/remotes/origin/*        	
          pushurl = ~/workspace/git-demo/heroku
          pushurl = ~/workspace/git-demde></pre>
    
  • 另外一种方式为:

      ➜  local git:(master) git remote set-url --add origin ~/workspace/git-demo/heroku
    

    这样在config文件中不是添加pushurl而是添加url,在push时同样会提交到两个repositories。

    不同的是当pull时,它会从第一个设置的url去更新代码。也就是说,如果我们改动config文件中的[remote “origin”],把heroku的url放在github之前,在执行git pull origin master时会从heroku更新代码。

  • 这样往往会造成困扰,所以我们可以添加一个单独的remote配置:

      [remote "both"]
          url = ~/workspace/git-demo/github
          url = ~/workspace/git-demo/heroku   然后执行`git push both`,就会将代码push到两个repositories了。
    


blog comments powered by Disqus