【问题标题】:How to update git repo or to create if there is no such repo如果没有这样的 repo,如何更新 git repo 或创建
【发布时间】:2013-09-17 23:28:58
【问题描述】:

我想要一个可以更新 git repo 的脚本。如果包含 repo 的文件夹存在,我希望它更新 repo,如果没有这样的文件夹,我想克隆 repo。

我想为该脚本指定两件事:

  • git 远程地址(例如ssh://git.example.com/var/git/repo.git
  • git repo 应该在哪里(例如/var/lib/git/repo

写这种脚本不是很难,但我认为这个任务很常见,已经解决了。

任务很简单,但有些事情应该小心完成。例如,repo 的主分支可以不是 master,而是其他东西,脚本应该在错误的情况下给出非零退出状态,如果 repo 有一些变化,它应该工作,等等。

所以我的问题是——我可以使用什么脚本来仔细解决克隆或更新 repo 的任务。

【问题讨论】:

    标签: git version-control git-pull git-clone


    【解决方案1】:

    这是简单的 ruby​​ 代码

    REPO_PATH = '/Users/full_path/to_repo'
    REPO_NAME = 'xxx'
    GITHUB_URL = 'git@github.com:xxx/xxx.git'   
    
    def change_dir_to_repo
      Dir.chdir(REPO_PATH)
      puts system('pwd')
    end   
    
    def git_repo_exists?
      if Dir.exists?(REPO_NAME)
        puts "Git repo #{REPO_NAME} exists."
        update_git_repo
      else
        puts "Git repo #{REPO_NAME} does not exists."
        clone_git_repo
      end
    end   
    
    def clone_git_repo
      system("git clone #{GITHUB_URL}")
      puts "Done"
    end  
    
    def update_git_repo
      puts "Changing directory to #{REPO_NAME}"
      Dir.chdir(REPO_NAME)
      puts "Changing branch to master"
      system('git checkout master')
      puts "updating git repo"
      system('git pull')
      puts "Done"
    end  
    
    change_dir_to_repo
    git_repo_exists?
    

    【讨论】:

    • 抱歉,所有内容都没有打印为代码。一旦我休息回来,我会编辑它。
    • 谢谢!但是,当 repo 中没有 master 分支时,此脚本无法正常工作(我有几个 repos,其中主分支的名称不是“master”)
    • @bessarabov 好吧,您可以根据需要编辑脚本。如果不了解您的所有要求,我们就无法编写完整的脚本。
    • =) 好吧,我非常希望我想要的只是一个普通的东西,并且已经有一个脚本。
    【解决方案2】:

    如果我必须尽快这样做,我会尝试使用 node,因为它提供了一些用于 git 集成的优秀库,而且我认为如果你不习惯其中任何一个,它现在比 bash 更容易一些。该脚本将执行以下操作:

    1) 导航到文件夹并执行简单的git status,任何命令都可以,因为如果它不是 git repo,它会这样说:

    fatal: Not a git repository
    

    1.a) 如果它不是一个 git repo,一个简单的“git clone url”就可以解决问题并且脚本存在

    2.a) 好的,所以没有错误,git status 会给你一个没有变化的干净分支,或者它会告诉你有变化

    2.a.a) 如果您想立即更新,请运行“git pull --ff-only”,这将防止不必要的合并。如果这失败了,那么我认为你应该手动解决问题。

    2.a.b) 如果您有本地更改,我也会退出脚本。

    要使用的库:

    我喜欢gift,但如果您查看 npm,还有很多其他的。如果您不想遵循我的建议,也可以使用 bash 脚本。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答,但我希望找到工作脚本而不是自己实现。顺便说一句,仅仅简单地检查 git 状态是不够的——在本地仓库中可能有不在远程仓库中的提交——我认为在这种情况下脚本也应该退出。
    • 在这种情况下 pull --ff-only 会失败并且脚本会退出。
    【解决方案3】:

    Van 也可以在 Build Server 上运行

    #peventing failure  
    mkdir $rep || true
    #succeeds always
    cd $rep
    #one of them will do the job!
    git clone $REMOTE_URL . || git pull
    

    如果在 Build Server 上运行,则 Couleur 会添加 git Status。

    【讨论】:

      猜你喜欢
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2014-11-01
      • 1970-01-01
      相关资源
      最近更新 更多