天道酬勤,学无止境

Emacs — 如何将 Git 存储库推送到多个远程服务器(Emacs — How to push a Git repository to multiple remotes)

问题

我正在寻找一些帮助,请使用 Emacs / Magit 将本地存储库更改一举推送到远程网站和 Github。

我发现了一个非 Emacs / 非 Magit 相关线程(https://stackoverflow.com/a/3195446/2112489),有评论指出这是推送到远程和 Github 的最终答案,并且它有一个几百个赞。 我认为(可能是错误的)这是我计算机上$HOME目录中本地.gitconfig文件的一个很好的起点。

[remote "GitHub"]
    url = git@github.com:elliottcable/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch "Master"]
    remote = GitHub
    merge = refs/heads/Master
[remote "Codaset"]
    url = git@codaset.com:elliottcable/paws-o.git
    fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote "Paws"]
    url = git@github.com:Paws/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/Paws/*

Emacs / Magit 中的基本 Push 命令一次只推送一个:

C-u P P [and then use arrow keys to select from the choices in the minibuffer] RET

查看可用命令的 Magit 备忘单:http://daemianmack.com/magit-cheatsheet.html


试探——用/usr/local/git/bin/git remote -v获取已经配置/usr/local/git/bin/git remote -v列表,然后用结果push到每一个。 . . 可行,但复杂。

$ MP:my_project.git HOME$ /usr/local/git/bin/git remote -v

  origin    git@github.com:lawlist/my_project.git (fetch)
  origin    git@github.com:lawlist/my_project.git (push)
  remote_website    lawlist@my-website.com:my_project.git (fetch)
  remote_website    lawlist@my-website.com:my_project.git (push)

COMMAND-LINE RECIPE——分别推送到远程和 Github:

;; Setup the remote repository and the hook; and the remote destination folder.
ssh lawlist@my-website.com
mkdir /home/lawlist/my_project.git
cd my_project.git
git init --bare
;; git update-server-info # If planning to serve via HTTP
cat > /home/lawlist/my_project.git/hooks/post-receive ;; RET
#!/bin/sh ;; RET
GIT_WORK_TREE=/home/lawlist/my_project git checkout -f ;; RET
;; C-d
chmod 755 /home/lawlist/my_project.git/hooks/post-receive
mkdir /home/lawlist/my_project
exit

;; On local machine.
mkdir /Users/HOME/.0.data/.0.emacs/elpa/my_project.git
touch /Users/HOME/.0.data/.0.emacs/elpa/my_project.git/README.md
cd /Users/HOME/.0.data/.0.emacs/elpa/my_project.git
/usr/local/git/bin/git init
/usr/local/git/bin/git add .
/usr/local/git/bin/git commit -m "First commit."
curl -u lawlist:12345678 https://api.github.com/user/repos -d '{"name":"my_project.git"}'
/usr/local/git/bin/git remote add origin git@github.com:lawlist/my_project.git
/usr/local/git/bin/git remote add remote_website lawlist@my-website.com:my_project.git
/usr/local/git/bin/git push origin master
/usr/local/git/bin/git push remote_website master

;; For modification of local files
/usr/local/git/bin/git add .
/usr/local/git/bin/git commit -m "This is a modification . . . ."
/usr/local/git/bin/git push origin master
/usr/local/git/bin/git push remote_website master
回答1

编辑(2014 年 4 月 23 日):添加了一个非 Magit 解决方案来暂存所有,提交所有(带有默认提交消息),并推送到所有远程。

编辑(2014 年 4 月 24 日):所有进程的打印输出现在发送到git-status-buffer ,它显示在函数的末尾 - 用户可以选择如何处理窗口 - - 例如,删除窗口、删除缓冲区和窗口,或者什么都不做。 添加了一些漂亮的着色(propertize "[...]" 'face 'font-lock-warning-face) 。 依赖于预先存在的 Magit 安装的功能的初稿已移至此答案的底部——该功能有效,但不如不依赖于安装 Magit 的当前版本那么复杂。

(defvar git-status-buffer "*GIT-STATUS*"
  "The buffer name of the git-status-buffer.")

(defvar git-branch-name nil
"The current branch of the working Git directory.")
(make-variable-buffer-local 'git-branch-name)

(defvar git-remote-list nil
"List of remote locations -- e.g., lawlist_remote or github_remote.")
(make-variable-buffer-local 'git-remote-list)

(defvar git-commit-message (format "Committed -- %s" (current-time-string))
"The predetermined Git commit message.")
(make-variable-buffer-local 'git-commit-message)

(defun git-branch-process-filter (proc string)
  (with-current-buffer (get-buffer git-status-buffer)
    (set (make-local-variable 'git-branch-name)
      (car (split-string string "\n")))))

(defun git-push-process-filter (proc string)
  (when (string-match "password" string)
    (process-send-string
      proc
      (concat (read-passwd "Password:  ") "\n")))
  (when (and
      (not (string-equal "Password: " string))
      (not (string-equal "\n" string))
      (not (string-equal "stdin: is not a tty\n" string)))
    (with-current-buffer git-status-buffer
      (goto-char (point-max))
      (insert "\n" (replace-regexp-in-string "\^M" "\n" string)))))

(defun git-push-process-sentinel (proc string)
  (when (= 0 (process-exit-status proc))
    (with-current-buffer (get-buffer git-status-buffer)
      (insert
        "\n"
        (propertize
          (format "Process `%s` has finished pushing to `%s`." proc git-remote-name)
          'face 'font-lock-warning-face)
        "\n"))
    (throw 'exit nil)))

(defun stage-commit-push-all ()
"This function does the following:
  * Save the current working buffer if it has been modified.
  * Obtain the name of the selected branch in the current working buffer.
  * Gather a list of all remotes associated with working directory Git project.
  * Stage all -- `/usr/local/git/bin/git add .`
  * Commit all -- `/usr/local/git/bin/git commit -m [git-commit-message]`
  * Push to all remotes:  `/usr/local/git/bin/git push -v [remote] [current-branch]`"
(interactive)
  (when (buffer-modified-p)
    (save-buffer))
  (when (get-buffer git-status-buffer)
    (with-current-buffer (get-buffer git-status-buffer)
      (kill-local-variable 'git-remote-list)
      (kill-local-variable 'git-branch-name)
      (erase-buffer)))
  (start-process
    "current-branch"
    git-status-buffer
    "/usr/local/git/bin/git"
    "rev-parse"
    "--abbrev-ref"
    "HEAD")
  (set-process-filter (get-process "current-branch") 'git-branch-process-filter)
  (set-process-sentinel
    (get-process "current-branch")
    (lambda (p e) (when (= 0 (process-exit-status p))
      (set-process-sentinel
        (start-process
          "list-remotes"
          git-status-buffer
          "/usr/local/git/bin/git"
          "remote"
          "-v")
        (lambda (p e) (when (= 0 (process-exit-status p))
          (let* (
              beg
              end
              git-remote-name)
            (with-current-buffer (get-buffer git-status-buffer)
              (goto-char (point-max))
              (while (re-search-backward "\(push\)" nil t)
                (beginning-of-line 1)
                (setq beg (point))
                (re-search-forward "\t" nil t)
                (setq end (- (point) 1))
                (setq git-remote-name (buffer-substring-no-properties beg end))
                (setq git-remote-list
                  (append (cons git-remote-name git-remote-list)))) ))
          (set-process-sentinel
            (start-process
              "stage-all"
              git-status-buffer
              "/usr/local/git/bin/git"
              "add"
              ".")
            (lambda (p e) (when (= 0 (process-exit-status p))
              (with-current-buffer (get-buffer git-status-buffer)
                (goto-char (point-max))
                (insert "\n"))
              (set-process-sentinel
                (start-process
                  "commit-all"
                  git-status-buffer
                  "/usr/local/git/bin/git"
                  "commit"
                  "-m"
                  git-commit-message)
                (lambda (p e) (when (= 0 (process-exit-status p))
                  (mapcar (lambda (git-remote-name)
                    (let ((proc
                        (start-process
                          "push-process"
                          git-status-buffer
                          "/usr/local/git/bin/git"
                          "push"
                          "-v"
                          (format "%s" git-remote-name)
                          (format "%s"
                            (with-current-buffer (get-buffer git-status-buffer)
                              git-branch-name)) )))
                      (set-process-filter proc 'git-push-process-filter)
                      (set-process-sentinel proc 'git-push-process-sentinel)
                      (recursive-edit) ))
                    (with-current-buffer (get-buffer git-status-buffer)
                      git-remote-list) )
                  (display-buffer (get-buffer git-status-buffer))
                  (message (concat
                    git-status-buffer
                    " -- ["
                    (propertize "d" 'face 'font-lock-warning-face)
                    "]elete window | ["
                    (propertize "k" 'face 'font-lock-warning-face)
                    "]ill buffer + delete window | ["
                    (propertize "n" 'face 'font-lock-warning-face)
                    "]othing"))
                  (let* (
                      (git-window-options (read-char-exclusive))
                      (target-window (get-buffer-window git-status-buffer)))
                    (cond
                      ((eq git-window-options ?d)
                        (with-current-buffer (get-buffer git-status-buffer)
                          (delete-window target-window)))
                      ((eq git-window-options ?k)
                        (with-current-buffer (get-buffer git-status-buffer)
                          (delete-window target-window)
                          (kill-buffer (get-buffer git-status-buffer))))
                      ((eq git-window-options ?n)
                        (message "Done!"))
                      (t (message "You have exited the sub-function.")) ))
                )))))))))))))

初稿(2014 年 4 月 19 日):此功能需要预先安装 Magit。 代码集上述不需要安装Magit的。

(defun push-to-all-remotes ()
"This function requires a pre-existing installation of Magit, and the function assumes
that the user has already staged and committed -- i.e., it only pushes to all remotes."
(interactive)
  (let* (beg end remote)
    (when (get-buffer "*REMOTES*")
      (with-current-buffer (get-buffer "*REMOTES*")
        (erase-buffer)))
    (set-process-sentinel
      (start-process
        "list-remotes"
        "*REMOTES*"
        "/usr/local/git/bin/git"
        "remote"
        "-v")
      (lambda (p e) (when (= 0 (process-exit-status p))
        (with-current-buffer (get-buffer "*REMOTES*")
          (goto-char (point-max))
          (while (re-search-backward "\(push\)" nil t)
            (beginning-of-line 1)
            (setq beg (point))
            (re-search-forward "\t" nil t)
            (setq end (- (point) 1))
            (setq remote (buffer-substring-no-properties beg end))
            (magit-run-git-async
              "push"
              "-v"
              remote
              (magit-get-current-branch))) ))))
    (display-buffer (get-buffer magit-process-buffer-name)) ))
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 从本地存储库推送到GitHub托管的远程服务器(Pushing from local repository to GitHub hosted remote)
    问题 我在开发机上使用Git GUI创建了Visual Studio 2010解决方案文件夹的本地存储库。 然后,我在GitHub帐户中创建了一个远程存储库。 现在,我正在寻找如何将本地存储库推送到远程存储库。 在SVN中,我可以使用TortoiseSVN进行提交,并将更改推送到远程存储库。 我看不到任何适用于Git的工具。 如何将本地存储库推送到GitHub上的远程存储库? 回答1 在首先使用git remote add [alias] [url]命令在两者之间建立关系之后,您可以使用git push命令将本地存储库推送到远程存储库。 如果您访问Github存储库,它将显示用于推送的URL。 您首先要输入类似以下内容: git remote add origin git@github.com:username/reponame.git 除非您首先针对远程存储库运行git clone ,否则这种情况下已经为您完成了这一步。 然后,您将输入: git push origin master 首次按下后,您只需输入以下内容: git push 当您将来希望更新远程存储库时。 回答2 类型 git push 从存储库目录中的命令行 回答3 Subversion始终隐式具有与之关联的远程存储库。 另一方面,Git允许许多“远程”,每个远程代表您可以推入或拉出的单个远程位置。
  • 如何将现有的Git存储库推送到Team Foundation Service(How can I push my existing Git repository to Team Foundation Service)
    问题 Microsoft现在在其Team Foundation Service上支持Git存储库。 我在Team Foundation Service上有一个帐户,我想将现有的Git存储库推送到那里的项目中。 每当我尝试进行搜索时,我都会不断查找诸如TFS-GIT或GIT-TF之类的东西。 我很确定我不需要这些,因为我认为这些更改对于代码存储库的Team Foundation Server模型而言,这不是我想要的。 具体来说,我有一个要推送到TFService的现有Git存储库。 回答1 好吧,我显然太复杂了。 这就是我所做的。 在TFService中创建了一个新项目在Visual Studio中连接到该项目在Visual Studio中克隆了该项目git pull c:\source\oldGitProject 就是这样,它从旧位置撤回了所有更改,我可以轻松地将其推送到TFService。 回答2 “如何将现有的git存储库推送到TFService?” 在tfs.visualstudio.com上声明了git repo后(请参见下文),请将该git repo url添加到您自己的本地repo的远程目录中: cd /path/to/local/repo git remote add tfs url://tfs/git/repo git push --mirror tfs
  • 如何使用Github管理点文件?(How to use Github to manage dotfiles?)
    问题 由于没有自动化,我很费力地将点文件存储在github中。 我必须自己更新。 有没有一种方法可以自动安装/更新/同步点文件? 我的意思是在新服务器中,我下载dotfiles并执行install脚本以将dotfiles复制到本地。 一段时间后,我可以执行updateToRemote脚本以将本地更改推送到远程仓库,而在另一台服务器上,我可以执行updateToLocal脚本以将远程更改推送到本地。 这样的事情。 回答1 有关dotfiles的信息的主要来源是dotfiles.github.io。 它基于symlink方法引用博客文章,如使用Git和Github管理您的Dotfiles。 首先,我们将所有点文件放入一个名为dotfiles的文件夹中,如下所示: /home/smalleycreative/dotfiles/vimrc 。 然后,我们将简单地从我们的主目录符号链接到它们。 Jaime提到Atlassian教程“存储点文件的最佳方法:裸露的Git存储库” 该技术包括使用特制别名将Git裸存储库存储在“侧”文件夹(例如$HOME/.cfg或$HOME/.myconfig )中,以便针对该存储库而不是通常的.git/ local运行命令文件夹,它将干扰周围的任何其他Git存储库。 (然后将dotfiles文件夹作为git repo管理) 回答2 上面的答案非常好,也正是我在
  • Git
    Git 介绍 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。 Git 与 SVN 区别 Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs等的文件夹里。Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。 Git 安装配置 安装包下载地址:https://gitforwindows.org/ 用户信息 配置个人的用户名称和电子邮件地址: $ git config --global user.name "runoob" $
  • 如何将本地Git存储库推送到另一台计算机?(How to push a local Git repository to another computer?)
    问题 我的笔记本电脑上有本地Git存储库设置。 我想将其推送到我的桌面上。 我怎样才能做到这一点? 回答1 如果您有权访问共享目录,则可以(请参见git clone和git remote): git clone --bare /path/to/your/laptop/repo /shared/path/to/desktop/repo.git git remote add desktop /shared/path/to/desktop/repo.git 这将创建一个裸仓库,在本地仓库中称为“桌面”。 由于它是裸露的,因此您可以将其推入(也可以在需要时从中拉出) git push desktop 正如ProGit所提到的,git确实支持文件协议: 最基本的是本地协议,其中远程存储库位于磁盘上的另一个目录中。 如果团队中的每个人都可以访问共享文件系统(例如NFS挂载),或者每个人登录到同一台计算机的可能性较小,则通常使用此方法。 回答2 这是我编写的用于执行此操作的脚本。 该脚本处理了我所有新git repos的常规初始化 创建.gitignore文件初始化.git 在服务器上创建裸git repo 设置本地git存储库以推送到该远程存储库 http://gist.github.com/410050 您绝对必须对其进行修改以适合您所进行的任何设置,尤其是在使用Windows笔记本电脑
  • 如何使用SourceTree将本地存储库推送到Bitbucket,而不先在Bitbucket上创建存储库?(How do I push a local repo to Bitbucket using SourceTree without creating a repo on bitbucket first?)
    问题 有没有一种方法可以将我的本地git仓库导入SourceTree并将其推送到我的Bitbucket帐户,并在我的帐户上创建与本地仓库相同的新仓库? 还是我必须先在线进行回购并推动该回购? Github提供了一种直接从客户端发布本地存储库的方法,并且可以在您发布时自动创建本地存储库,但是私有存储库数量有限。 我只是在做家庭作业,所以没有理由公开它,因此为什么我要使用bitbucket。 回答1 (于2019年3月29日更新为使用https而不是ssh,因此您无需使用ssh密钥) 对于BitBucket而言,您似乎必须首先在线创建存储库。 按照Atlassian的说明,只需创建一个新的BitBucket存储库,将存储库URL复制到剪贴板,然后将该存储库作为新的远程添加到本地存储库(下面的完整步骤): 获取回购网址 在您的BitBucket存储库中,选择右上角的“克隆” 在对话框的右上角选择“ HTTPS”而不是“ SSH” 它应该以git clone <repository url>的形式显示您的回购网址 使用CLI添加远程 cd /path/to/my/repo git remote add origin https://bitbucket.org/<username>/<reponame>.git git push -u origin --all
  • 如何将具有历史记录的SVN存储库迁移到新的Git存储库?(How do I migrate an SVN repository with history to a new Git repository?)
    问题 我阅读了Git手册,常见问题解答,Git-SVN崩溃课程等,它们都对此进行了解释,但是在任何地方都找不到像以下这样的简单说明: SVN存储库位于: svn://myserver/path/to/svn/repos Git存储库位于: git://myserver/path/to/git/repos git-do-the-magic-svn-import-with-history \ svn://myserver/path/to/svn/repos \ git://myserver/path/to/git/repos 我不希望它那么简单,也不希望它是单个命令。 但我确实希望它不会尝试解释任何内容-仅说明在此示例中应采取的步骤。 回答1 魔法: $ git svn clone http://svn/repo/here/trunk Git和SVN的操作非常不同。 您需要学习Git,并且如果您想从SVN上游跟踪更改,则需要学习git-svn 。 git-svn主页上有一个很好的示例部分: $ git svn --help 回答2 创建一个用于将SVN用户映射到Git的用户文件(即users.txt ): user1 = First Last Name <email@address.com> user2 = First Last Name <email@address.com>
  • 我可以将现有的git repo与openshift一起使用吗?(Can I use my existing git repo with openshift?)
    问题 仅在openshift上才需要git repo吗? 我已经有bitbucket / github git repo,并且只想推送到那里。 我可以简单地挂入它,以便openshift获得亲密感吗? 还是为了简化起见,我只在github上推送内容,但是当我要进行部署时,我会使用openshift做什么? 我确实检查了一下,但它使我感到困惑:它是在谈论合并退出和新的(openshift)git吗? 回答1 我的印象是您还不习惯使用git。 我建议您进入git,以充分了解如何将代码推送到openshift。 不过,让我尝试向您解释其中涉及的步骤:与通常使用git一样,此处选择的方法是将其他git repo(例如,在bitbucket上)克隆到本地计算机上: git clone <bitbucket-repo-url> 然后,本地克隆会将您的其他存储库(bitbucket等)作为远程存储库。 您的远程仓库以别名“ origin”存储(如果您进行克隆,则git使用的默认别名)。 然后,您将openshift存储库添加为克隆的远程存储库。 您可以在为添加的远程仓库明确使用别名的同时执行此操作-我在此处使用“ openshift”作为别名: git remote add openshift -f <openshift-git-repo-url>
  • 是否可以在不打开浏览器的情况下从CLI在GitHub上创建远程仓库?(Is it possible to create a remote repo on GitHub from the CLI without opening browser?)
    问题 我创建了一个新的本地Git存储库: ~$ mkdir projectname ~$ cd projectname ~$ git init ~$ touch file1 ~$ git add file1 ~$ git commit -m 'first commit' 是否有任何git命令创建一个新的远程仓库,并从此处将我的提交推送到GitHub? 我知道启动浏览器并创建一个新存储库没什么大不了的,但是如果有一种方法可以从CLI中实现这一点,我会很高兴的。 我阅读了大量文章,但没有发现提及如何使用git命令从CLI创建远程仓库的文章。 蒂姆·卢卡斯(Tim Lucas)的精彩文章建立新的远程git存储库是我发现的最近的项目,但是GitHub不提供shell访问权限。 回答1 使用Github的官方新命令行界面: gh repo create 请参阅其他详细信息和选项以及安装说明。 例如,要完成您的git工作流程,请执行以下操作: mkdir project cd project git init touch file git add file git commit -m 'Initial commit' gh repo create git push -u origin master 回答2 github API v3的CLI命令(替换所有CAPS关键字): curl -u
  • 如何推送到非裸露的Git存储库?(How to push to a non-bare Git repository?)
    问题 我通常通过ssh(屏幕和vim)在远程服务器上工作,那里有一个Git存储库。 有时我不在线,所以我在笔记本电脑上有一个单独的存储库(从远程克隆)。 但是,由于我通常位于防火墙后面或没有公共IP,因此无法从远程存储库中提取信息。 我读过我应该只推送到一个裸仓库。 然后,我应该如何将更改推送到远程存储库? 回答1 receive.denyCurrentBranch updateInstead 这个选项是在Git 2.3中添加的,如果服务器是干净的,它可以使服务器更新其工作树。 因此,如果您确保在本地拉动之前始终进行提交,并在服务器上保持干净的工作树(应该这样做以避免合并冲突),那么此选项是一个很好的解决方案。 用法示例: git init server cd server touch a git add . git commit -m 0 git config --local receive.denyCurrentBranch updateInstead cd .. git clone server local cd local touch b git add . git commit -m 1 git push origin master:master cd ../server ls 输出: a b 回答2 最佳选择 推入非裸露的远程存储库的最干‡
  • 如何解决Git存储库中的合并冲突?(How to resolve merge conflicts in Git repository?)
    问题 我想解决我的Git存储库中的合并冲突。 怎么做 ? 回答1 尝试: git mergetool 它会打开一个GUI,逐步引导您解决每个冲突,然后您可以选择如何合并。 有时,之后需要进行一些手动编辑,但通常仅此一项就足够了。 这肯定比手工完成整个事情要好得多。 根据@JoshGlover的评论: 命令 除非您安装一个GUI,否则不一定会打开GUI。 对我运行git mergetool导致使用了vimdiff 。 您可以安装以下工具之一,而不是使用它: meld , opendiff , kdiff3 , tkdiff , xxdiff , tortoisemerge , gvimdiff , diffuse , ecmerge , p4merge , araxis , vimdiff , emerge 。 以下是使用vimdiff解决合并冲突的示例过程。 基于此链接 第1步:在终端中运行以下命令 git config merge.tool vimdiff git config merge.conflictstyle diff3 git config mergetool.prompt false 这会将vimdiff设置为默认的合并工具。 第2步:在终端中运行以下命令 git mergetool 步骤3 :您将看到以下格式的vimdiff显示 ╔═══════╦══════╦══
  • Git将现有的回购推送到新的和不同的远程回购服务器?(Git push existing repo to a new and different remote repo server?)
    问题 假设我在git.fedorahosted.org上有一个存储库,我想将此存储库克隆到我在github上的帐户中,以便在fedorahosted上的“正式”存储库之外拥有自己的游乐场。 最初将其复制过来的步骤是什么? 在github中有一个很好的“ fork”按钮,但是出于明显的原因,我不能使用它。 我将如何跟踪在fedorahosted存储库中的更改到github中的更改? 回答1 在github上创建一个新的仓库。 将存储库从fedorahosted克隆到本地计算机。 git remote rename origin upstream git remote add origin URL_TO_GITHUB_REPO git push origin master 现在,您可以像使用其他任何github存储库一样使用它。 要从上游拉补丁,只需运行git pull upstream master && git push origin master 。 回答2 有一个有用的链接,这个问题的答案已删除:https://help.github.com/articles/duplicating-a-repository 要点是 0. create the new empty repository (say, on github) 1. make a bare clone of the
  • 将现有的Git存储库推送到SVN(Pushing an existing Git repository to SVN)
    问题 我一直在Git中完成所有工作,并推送到GitHub。 我对软件和网站都感到非常满意,并且目前我不希望更改自己的工作方式。 我的博士顾问要求所有学生将他们的工作保存在该大学托管的SVN存储库中。 我已经找到了大量有关将现有SVN存储库放入Git的文档和教程,但没有关于将Git存储库推入新的SVN存储库的内容。 我希望一定有某种方法可以将git-svn和一个新鲜的分支,重新定级以及所有这些奇妙的条件结合起来使用,但是我是Git新手,对任何一个都不感到自信。 然后,我只想运行几个命令即可在我选择时将提交推送到该SVN存储库。 我希望继续使用Git,只是让SVN存储库镜像Git中的内容。 如果有任何不同,我将是唯一致力于SVN的人。 回答1 我也需要这个,并且在Bombe的答案和一些摆弄的帮助下,我开始了它的工作。 这是食谱: 导入Git-> Subversion 1. cd /path/to/git/localrepo 2. svn mkdir --parents protocol:///path/to/repo/PROJECT/trunk -m "Importing git repo" 3. git svn init protocol:///path/to/repo/PROJECT -s 4. git svn fetch 5. git rebase origin/trunk 5
  • 将现有Git存储库推送到SVN
    我一直在用Git完成所有工作并推送到GitHub。 我对软件和网站都非常满意,我不想在此时改变我的工作方式。 我的博士生顾问要求所有学生将他们的工作保存在大学托管的SVN存储库中。 我已经找到大量关于将现有SVN存储库下载到Git中的文档和教程,但没有关于将Git存储库推送到新的SVN存储库。 我希望必须有一些方法来实现这一点,结合使用git-svn和一个新的分支和变基和所有那些精彩的术语,但我是一个Git新手,并且对它们中的任何一个都没有信心。 然后我想在我选择时运行几个命令将提交推送到该SVN存储库。 我希望继续使用Git,只是拥有SVN存储库镜像Git中的内容。 如果这有任何不同,我将是唯一一个承诺进入SVN的人。 #1楼 我会使用SubGit在4个命令中提出一个非常简短的指令。 有关详细信息,请参阅此帖 #2楼 如果您不必使用任何特定的SVN并且您使用的是GitHub,则可以使用其SVN连接器。 更多信息在这里: 使用Subversion在GitHub上进行协作 #3楼 我想分享一个名为Scatter的WordPress社区中使用的很棒的工具 Git WordPress插件和一点理智分散 这使用户能够自动将他们的Git存储库发送到wordpress.org SVN。 理论上,此代码可以应用于任何SVN存储库。 #4楼 我需要将现有的Git存储库提交到空的SVN存储库。
  • 推送大型github存储库失败,并显示“无法推送到不合格的目的地:主服务器”(Pushing a large github repo fails with “unable to push to unqualified destination: master”)
    问题 我有一个很大的git repo(从SVN repo创建),我想将其推送到github。 考虑到它很大,我不能直接尝试将其推入,因为它会因“打包太大”错误而失败。 到目前为止一切顺利,我可以一次推送一次回购。 但是,当我尝试执行此操作时,会发生以下情况: git push origin 86c310d8a680d6d0e052fa7db89adb25348f3e54:master error: unable to push to unqualified destination: master The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. 因此,远程存储库中还没有master分支,但是我试图将其推送到它,但是它失败了。 我该如何解决? 或如何在远程上创建一个空的master分支以便推送到它? 回答1 仅此一次推送至refs/heads/master 。 git push origin whatever:refs/heads/master 这样就可以明确地将其创建为分支,并且将来您将能够正常推送到该分支。 之所以可行
  • 如何正确强制执行Git推送?(How do I properly force a Git push?)
    问题 我已经建立了一个远程的非裸露的“主”仓库,并将其克隆到我的计算机上。 我进行了一些本地更改,更新了本地存储库,然后将更改推回到远程仓库中。 到那时为止一切都很好。 现在,我不得不更改远程仓库中的某些内容。 然后,我更改了本地存储区中的某些内容。 我意识到不需要更改远程仓库。 因此,我尝试将本地存储库中的git push送到远程存储库中,但出现类似以下错误: 为防止丢失历史记录,拒绝了非快速转发更新。合并远程更改,然后再次推送。 有关详细信息,请参见git push --help的“关于快进的注意事项”部分。 我以为可能 git push --force 会强制我的本地副本将更改推送到远程副本,并使其保持不变。 它确实强制执行更新,但是当我返回到远程存储库并进行提交时,我注意到文件包含过时的更改(主要远程存储库以前具有的更改)。 正如我在对答案之一的评论中提到的: [我]尝试强制执行,但是当回到主服务器以保存更改时,我得到了过时的暂存。 因此,当我提交存储库时,它们是不一样的。 当我再次尝试使用git push时,出现了相同的错误。 如何解决此问题? 回答1 做就是了: git push origin <your_branch_name> --force 或者,如果您有特定的回购协议: git push https://git.... --force
  • 推送后如何压缩git中的提交?(How to squash commits in git after they have been pushed?)
    问题 这很好地解释了压缩多个提交: http://git-scm.com/book/en/Git-Branching-Rebasing 但不适用于已被推送的提交。 如何在本地和远程存储库中压缩最近的几次提交? 当我执行git rebase -i origin/master~4 master ,将第一个保留为pick ,将其他三个保留为squash ,然后退出(通过emacs中的cx cc),我得到: $ git rebase -i origin/master~4 master # Not currently on any branch. nothing to commit (working directory clean) Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added" $ git rebase -i origin/master~4 master Interactive rebase already started 其中2f40是pick提交。 现在这4个提交都没有出现在git log 。 我希望我的编辑器可以重新启动,以便我可以输入提交消息。 我究竟做错了什么? 回答1 壁球本地提交 git rebase -i origin/master~4
  • 将仓库从 git 导入到 gerrit(Import repository from git to gerrit)
    问题 我有两个关于 Gerrit 的问题: 如何将已经存在的 Git 存储库转换或导入 Gerrit 的格式? 有很多没有 Gerrit 控制的提交,我想简单地将这些提交推送到 Gerrit 项目中。 我看到了两种方法: 将现有的裸 Git 目录复制到 Gerrit,然后将其添加到数据库中。 这是一种安全的方法吗? 将所有提交从我的本地存储库推送到 gerrit 存储库。 如何将存储库从 Gerrit 恢复为原始 Git 格式? 是否需要删除 Gerrit 的特殊*/for/*分支才能做到这一点? 回答1 首先:没有特殊的“Gerrit 格式”。 Gerrit 使用常规 git 存储库。 在 Gerrit 中创建一个新项目(没有初始提交)。 将创建的存储库作为远程添加到您现有的存储库,然后简单地推送。 您可以配置 Gerrit 以允许直接推送到存储库(绕过审查),从而允许您导入整个存储库。 或者,如果您可以直接访问 Gerrit 的存储库位置(例如,通过 SSH 或在本地文件系统上),您可以直接推送到存储库(无论 Gerrit 创建它的地方),完全绕过 Gerrit。 但是,您需要在之后刷新 Gerrit 缓存,以便 Gerrit 注意到存储库 HEAD 已更新。 如前所述,没有“Gerrit 格式”。 只需从 gerrit 克隆您的存储库,一切都很好。 您无需担心任何特殊分支。
  • 如何将GIT存储库从一台服务器迁移到新服务器(How to migrate GIT repository from one server to a new one)
    问题 我有一台要关闭的服务器。 我剩下的唯一要迁移的是我的存储库。 该服务器被列为我的一个项目的来源(主服务器)。 移动存储库以保留历史记录的正确方法是什么? 回答1 要添加新的回购位置, git remote add new_repo_name new_repo_url 然后将内容推送到新位置 git push new_repo_name master 最后删除旧的 git remote rm origin 之后,您可以执行bdonlan所说的操作,然后编辑.git / config文件以将new_repo_name更改为origin。 如果您不删除原始资源(原始远程存储库),则只需使用以下命令将更改推送到新存储库即可 git push new_repo_name master 回答2 如果要迁移所有分支和标记,则应使用以下命令: git clone --mirror [oldUrl] 用所有分支克隆旧仓库 cd the_repo git remote add remoteName newRepoUrl 设置一个新的遥控器 git push -f --tags remoteName refs/heads/*:refs/heads/* 将所有裁判推到裁判/门下(这可能是您想要的) 回答3 更新为使用git push --mirror origin而不是注释中建议的git push
  • 超过Github远程推送包大小(Github remote push pack size exceeded)
    问题 我是Git的新手,并且有一个相当大的项目,我想将其推送到Github上的远程仓库(仓库B)。 原始项目也位于Github上,但来自另一个回购协议(Repo A)。 我必须对Repo A中的文件进行一些更改,然后才能在Repo B上设置项目。我已经设置了遥控器,ssh键等,并且在将代码库推送到Repo B时遇到了问题。 我一直收到以下错误: $ git push <remote_repo_name> master Enter passphrase for key '/c/ssh/.ssh/id_rsa': Counting objects: 146106, done. Delta compression using up to 4 threads. Compressing objects: 100% (35519/35519), done. fatal: pack exceeds maximum allowed size00 GiB | 154 KiB/s fatal: sha1 file '<stdout>' write error: Invalid arguments error: failed to push some refs to 'git@github.com:<repo>.git 我在本地gitconfig中更改了以下设置 git config pack