如何在GitHub上分叉自己的存储库?

30

作为一个完全不了解 Git 的新手,我读了一些指南并认为自己已经掌握了基础知识,但我还是无法实现一个目标。

我创建了一个用于存储通用标记源代码的仓库。这里面只有我重复使用的代码。它被称为 markupDNA.git

我希望在我的 mac sites 文件夹中创建不同的目录,例如 ~/Sites/project-N,在这些目录中,我将基于通用代码构建不同的网站。我想将这些目录与我的主仓库关联起来,就像 fork 一样,但你不能 fork 自己的仓库?

我希望能做类似于以下这样的事情:

git clone <url> name
git add .
# make changes
git commit -m 'whatever'
git push
但我不想把它推到origin。我希望它能推到一个复制品的markupDNA仓库,从它被克隆的地方开始。但它似乎只是将我的更改直接推到了原始主分支。这个想法是保持markupDNA的干净,并为我不同的项目拥有许多分叉,每个分叉都会在我的硬盘上有自己的克隆目录。
任何想法?

可能是如何在Github上分叉自己的项目?的重复问题。 - Shane
7个回答

24

你做得很对。

cd ~/Sites/
git clone ~/Dev/markupDNA/ project-N
cd project-N
git remote rename origin markupDNA
  • 前往存储项目的文件夹
  • 克隆您的基本markupDNA仓库并自定义名称
  • 重命名远程,以便稍后可以使用'origin'

3
这正是我需要使用我的骨架应用程序。为每个使用骨架应用程序的项目创建一个分支是不明智的。通过这种方式,我仍然可以从骨架应用程序中提取更新。 - NDM
1
当您需要使用骨架应用程序中的更改进行更新时,您可以使用 git pull MarkupDNA master - Nick

21

使用分支(branches)可能比使用单独的分叉(forks)简单得多。您仍然可以为每个分支拥有单独的检出;只需多次克隆您的 repo,并在每个检出中使用 git checkout 切换到适当的分支(或使用 git checkout -b 同时创建并检出该分支)。一旦创建了分支,就可以使用 git push origin <branchname> 将它们推送到 GitHub。


这似乎是一个不错的方法。但是当我克隆我的repo,创建一个新分支,从该分支进行编辑并尝试执行“git push git@github.com:rorourke/markupDNA.git”时,该分支在github上没有出现? - Fuego DeBassi
1
你需要执行 "git push origin <new-branch-name>" 命令在远程创建新分支。我很惊讶你引用的命令没有报错,或者有吗? - ebneter
@Fuego,正如ebneter所说,当将新分支推送到GitHub时,您需要指定要推送的分支名称。 - Brian Campbell
如果您想使用多个检出,应该使用 --shared 选项从第一个克隆后续副本。此选项将使用第一个存储库中的对象,使您无需在磁盘上拥有两个副本。请阅读相关手册页面! - George Hilliard
1
分支的使用并不是同一件事情。实际上,它只是一个部分解决方案,因为您无法使用单独的问题和单独的维基。 - Alen Pelin

11

这篇教程提供了一个简单明了的答案:

  1. 创建一个新的空的Github forkedrepo仓库
  2. 将其在本地克隆:

    git clone https://github.com/YOURUSERNAME/forkedrepo.git
    
  3. 将原始的 GitHub 存储库添加为新本地存储库的远程仓库:

  4. git remote add upstream https://github.com/YOURUSERNAME/originalrepo.git
    
  5. 将原始的Github代码库复制到您的新本地代码库中:

  6. git pull upstream master
    
  7. 将新本地代码库中的文件推送到新的 GitHub 代码库:

  8. git push origin master
    

当然,GitHub不会将此视为原存储库的分叉,但这是最好的选择。


10

惊讶的是还没有人提到这位先生的博客文章

以下是相关步骤:

$ git clone git@github.com:YOURNAME/foo.git bar
$ cd bar
$ vim .git/config
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:YOURNAME/bar.git #replace foo with bar
$ git remote add upstream git@github.com:YOURNAME/foo.git
$ git push -u origin master

我通常不编辑配置文件,而是使用git remote removegit remote add的组合。

如果你想保留上游源的话,你也可以使用git remote rename后跟git remote add


只是好奇,你为什么想要分叉自己的项目? - yan
一个原因是如果你要清理它,但想要旧历史记录的记录。例如,删除许多旧分支和标签。 - funroll
3
当已经有git命令来进行适当的编辑时,使用vim有些不必要:'$ git clone git@github.com:YOURNAME/foo.git bar','$ cd bar','$ git remote rename origin upstream','$ git remote add origin git@github.com:YOURNAME/bar.git',然后'$ git push -u origin master'。 - user139901
1
@B.Garvin 有同样的想法。如果您希望,可以随意编辑我的答案。 - funroll
@ funroll 哇,我想我可能没有仔细阅读,是的,你已经在我的评论中说了一切。对此感到抱歉。 - user139901
@B.Garvin 没关系!顺便说一下,我并没有试图表现得讽刺...实际上在我写评论的时候我没有注意到我已经提到了那些命令。感谢您的建议。 - funroll

9

要创建自己仓库的真正GitHub分支,您可以按照以下步骤进行:

  1. 创建一个组织
  2. 将其fork到组织中
  3. 重命名forked项目
  4. 移回到您的账户

3
当我将“所有权转让”还给自己时,收到了“rdp已经在rdp/screen-capture-recorder-to-video-windows-free网络中有一个存储库”的提示。但是,我可以使用组织中找到的副本,谢谢! - rogerdpack
是的,我也遇到了同样的错误... 我甚至无法在重命名后将该分支项目再次 fork 给自己。希望我能让 GitHub “忘记”它曾经是一个 fork... - Adam Burley
你能详细说明如何使用 git pull-rebase upstream master 吗?我不太明白。这个方法在帖子中尝试“4.移回到您的账户”时会抛出错误。 - Noitidart
是的,似乎这种方法在GitHub上不再起作用了。我想说的是,“在Git中fork”意味着你可以将代码推送到另一个远程/存储库,但在GitHub术语中它不会被视为fork。 - cnd
3
对于私有仓库,当尝试将其移回时,这种方法行不通..."该仓库无法转移。请联系根仓库的所有者。" - Eddie Jaoude
显示剩余2条评论

1

当然你可以从一个克隆库中再克隆出来。在 Git 中没有主库的概念。人们通常指定一个主库,但这只是基于惯例而非技术原因。

所以你可以按照你描述的方式甚至更多地操作。

例如,在你的专用网站中保留一个分支,用于添加或修改通用内容的想法,这样做是有意义的。你可以将它们拉到通用库中,然后再次分发。


1
您还可以使用Github的导入工具。 (它是用于从SVN等导入的,但您也可以用于此)
  • 在Github中创建新仓库。 重要提示:不要“初始化自述文件”
  • 在下一个屏幕上单击“导入代码”
  • 粘贴要导入的Github存储库的URL。 (截图)

同样,这是在Github上创建一个新存储库,而不是真正的分叉。 但是您的所有分支,历史记录等都将在那里。


1
这比其他所有选项都容易得多。 - Jeffrey Lionel van Houdt

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