“git remote add origin”、“set-url origin”和“config”的区别是什么?

4
似乎至少有三种方法可以完成听起来相同的事情。
# 1. git remote add origin https://x@bitbucket.org/x/y.git
# 2. git remote set-url origin ssh://git@bitbucket.org/x/y.git 
# 3. git config --local remote.origin.url ssh://git@bitbucket.org/x/y.git
  • 它们有什么区别?
  • 哪种方式是首选或标准方式?

注意:这可能看起来像这个问题的副本,但那些答案不完整,也没有解释更改URL与“remote”的差异?

编辑:

进行进一步搜索: SO回答中说:

Git中的remote基本上是指向其他存储库的书签,您可能希望从中拉取或推送代码。书签存储库可能位于您计算机上的不同文件夹中,在远程服务器上,甚至可以是存储库本身...但最简单的类比是书签。存储库甚至不必是您存储库的版本,它甚至可以是完全不相关的存储库。

这个

origin不是远程存储库名称。它实际上是一个本地别名,作为远程存储库URL的键集。

3个回答

9
git remote 命令用于操作(添加、移除和处理)远程仓库。它有十个子命令:
  1. git remote add
  2. git remote rename
  3. git remote remove
  4. git remote set-branches
  5. git remote set-head
  6. git remote get-url
  7. git remote set-url
  8. git remote show
  9. git remote prune
  10. git remote update
每个子命令可能有自己的子命令或选项;如果没有任何子命令运行,git remote 就会简单地列出所有远程仓库。
由于某种原因,您只询问了这十个子命令中的两个: addset-url 。这可能是因为您不确定首先什么是远程仓库。简短的答案是,一个远程仓库只是一个名称,但它是一个用于跟踪另一个 Git 仓库的名称,在某个其他URL上。
虽然origin是一个相当标准的远程仓库名称,但它并不是唯一可能的远程仓库名称,而且您自己的仓库可能没有远程仓库,在这种情况下,origin 不是您的远程仓库之一。
然而,许多(如果不是大多数)仓库只有一个远程仓库,因为许多仓库是通过git clone创建的。 git clone 命令会自动创建一个远程仓库,它将其命名为origin,除非您告诉它使用其他名称。因此,大多数仓库已经有了一个名称为origin的远程仓库。

git remote add

git remote add 的作用是添加一个新的远程仓库。 如果您现在有一个远程仓库,并添加另一个,则会有两个远程仓库。 如果没有,则添加一个,您将拥有一个。
再次强调,远程仓库的目的是为了给另一个 Git 仓库命名,并且该其他 Git 仓库将在某个 URL 上被找到。因此,要使远程仓库有用,它需要一个URL。 因此,git remote add 接受两个参数:要添加的远程仓库的名称和与该名称关联的URL。

这里省略了很多关于远程仓库的高级操作。尽管我个人觉得其中一些并不实用,但它们是 git remote add 命令有一堆选项的原因。

git remote set-url

git remote set-url 的主要作用是更改已存在的远程仓库的 URL。因此需要提供一个现有远程仓库的名称和一个新 URL。默认操作是删除旧 URL 并替换为新的。

Git 不限制您只能使用一个 URL:它允许每个命名的远程仓库附加多个 URL。当一个远程仓库有多个 URL 时会发生什么事情,这有点棘手;最好在熟悉单个URL远程仓库之后再进行这样的操作。

git config

git config 命令是更低级别的操作。您可以通过 Git 中的 配置项 大部分地进���设置或更改,包括添加、删除远程仓库以及更改与任何一个特定远程仓库相关联的 URL。这意味着较高级别的 git remote 命令通常会转换成一个或多个低级别的 git config 操作。如果您确切地知道哪些配置项在以哪种方式控制着哪个(些)远程仓库,那么您可以使用 git config 来实现一些与 git remote 相同的操作。

git remote 命令可以完成的一些���作并不仅仅是配置设置,因此并非所有操作都可以通过这种方式进行转换。但是添加或删除一个远程仓库,并更改其 URL,则可以进行转换。

添加新的远程仓库基本上包括运行两个 git config 命令。如果远程仓库的名称是 R,则这两个配置项分别是 remote.R.urlremote.R.fetch。通常不推荐只设置第一个而不设置第二个,并且您需要知道要将第二个设置为什么,因此最好使用 git remote 来添加新的远程仓库。

更改现有远程仓库的(单个)URL 只需要运行一个 git config 命令。 对于远程仓库 R,可以使用 git config remote.R.url new-url 命令来更改 URL(默认情况下,git config 使用 --local 参数,因此可以省略)。 URL 不影响 fetch 值,因此使用 git config 进行更改比使用 git remote 更加安全(尽管有点无意义)。 但是,如果某个特定的远程名称有多个 URL,则 git remote 添加了安全检查,而 git config 完全绕过这些检查。

完美的答案。谢谢。 - not2qubit

1

相似但不同

实际上,当你运行git remote add origin git@github.com:User/TestRepo.git时,会创建一个名为origin的新远程。

当你运行git remote set-url origin git@github.com:User/TestRepo.git时,git会搜索已经存在且名字为origin的远程仓库,并更改其远程仓库的url。但是,如果git找不到名为origin的远程仓库,它会产生错误信息:fatal: No such remote 'origin'


0
在第一种情况下,当您运行remote origin some@github.com/User/repo时,您将创建一个名为origin的新远程。
在另外两种情况下,Git会搜索现有的远程,它们的名称都是origin。这些示例没有首选方式,因为命令执行不同的操作。

1
那么 origin 只是一个别名吗?这是否意味着我可以写成:git config --local remote.mybucket.url ssh://git@bitbucket.org/x/y.git,假设我已经添加了 mybucket - not2qubit
这是一个好问题。我也想知道答案。也许@not2qubit可以将其作为自己的问题发布吗? - Eric Hepperle - CodeSlayer2010

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接