使用现有仓库初始化新的Git仓库

5

我在github上已经有一个现有的代码库,现在想把同样的文件推送到一个新的代码库中。我在终端中运行git init命令,并显示"Reinitialized existing Git repository in..."。

那么我该如何将文件推送到我的新代码库中?


旧的代码库还有代码吗?还是你已经删除了那个代码库并将代码保存在你的系统中了? - Ajay Lingayat
我已删除旧的代码库。 - Austin737
你现在把代码/文件放在哪里了? - Ajay Lingayat
仅在我的本地机器上。 - Austin737
你可以使用git remote add命令将URL添加到新的存储库中,并将其推送。 - flaxel
你能运行 git remote -v 并将其输出附加到问题中吗? - Ajay Lingayat
3个回答

5
你可以尝试以下方法:
删除旧的“origin”远程端并添加新的“origin”远程端。
git remote remove origin
git remote add origin [new_repo_path].git

将所有文件添加并提交更改

git init .
git add -A
git commit -am "Initial commit"

现在将文件推送。

git push

git push --set-upstream <我的 Github URL> 成功了,我会给你点数的,因为你的回复基本上让我成功了。拍个手吧,兄弟! - Austin737

2

您在评论中声称:

我删除了旧存储库

但实际上您并没有删除:

Reinitialized existing Git repository in ...
正如您从此消息中可以看到的那样,Git正在“重新初始化”现有存储库。这基本上什么也没做。1 请记住,存储库不是“一堆文件”,而是提交的集合。更准确地说,存储库在其核心处包含两个数据库:
- 主数据库通过克隆进行复制,它保存了Git的所有内部对象。这包括您的提交作为内部提交对象,以及另外三种使提交对象按我们期望的方式工作的对象类型。 - 次要数据库保存了所有可以找到提交的名称。这包括分支名称、标签名称、远程跟踪名称和其他名称。这个数据库通常不会被直接复制,至少不是通过克隆:执行克隆的Git会读取它,但修改要存储的内容,因此某个现有存储库的新副本通常具有所有提交但没有任何分支。
(在克隆过程结束时,执行克隆的Git通常会在新存储库中创建一个新的分支名称。在此处创建的分支名称标识与源存储库中的某个名称相同的提交。您可以使用git clone命令的参数选择要创建的新分支名称(如果有),如果您不选择,则您的Git会根据源存储库建议选择要创建的分支。GitHub和其他托管服务器称此建议为“默认分支”。他们需要一个术语来描述这一点,因为他们通过他们的Web界面设置建议。实际上,它只是源存储库中HEAD所附加到的任何分支名称。)
当您在计算机上的Git存储库内部工作时,您看到和使用的“文件”不在存储库内。它们在您的工作树或工作树中。存储库通常包含在工作树顶层的.git目录中。2 在这里,“不在存储库中”的短语正在执行一些相当重要的工作。我的意思是这个:
  • Git最初将某个提交中的文件从提交中复制到您的工作树中。
  • 存储在每个提交中的文件以一种特殊的、只读的、Git专用的、压缩和去重的格式存储。大多数程序根本无法读取这些文件。这就是为什么Git必须将它们复制到普通的读/写文件中。
  • 一旦它们从提交中复制出来,它们就不再是Git的文件了。它们是您的文件,您可以随心所欲地处理它们。您可以更改它们、组合它们、分离它们、删除它们,甚至像折叠、钉住/穿孔、弯曲或以其他方式毁坏它们。它们是您的文件,而不是Git的文件。
  • 这也是为什么要将这些文件放入一个新的提交中,您需要不断运行git add的原因。git add命令将文件复制回Git(重新压缩和去重),使其准备好被提交。

这意味着要删除存储库,您必须删除.git目录本身。无论存在多少该存储库的其他副本——请记住,每个git clone都复制了所有提交,我们通常称之为“存储库的副本”3——这个特定的存储库都在.git目录中。


1它的主要功能是将新的挂钩模板目录复制到指定位置。如果您没有调整现有的挂钩,并且正在使用与以前相同的标准挂钩模板,则实际上不会发生任何事情。如果您正在使用不同的模板目录,则此类“重新初始化”可能很有用。我从未听说过有人真正这样做,但肯定有某些人会将其作为例行程序执行。

2在子模块中,存储库通常移动到其他位置,而不是一个.git目录,您会找到一个.git文件。不作为子模块的存储库也可以使用此机制,使用git worktree add创建的工作树使用此机制从添加的工作树中引用存储库。

3尽管git clone不会复制任何分支名称,但克隆通常和完全复制一样好,因为副本的所有者现在可以为他们克隆中拥有的每个远程跟踪名称创建一个分支名称。那些远程跟踪名称是复制您克隆的分支名称的结果。一旦他们创建这样的名称,他们就拥有了与您相同的所有分支。

如果他们愿意,他们可以将每个远程跟踪名称复制到两个分支名称,这样他们就拥有了比您多一倍的分支。这就是Git中关于分支的问题:它们实际上并不重要。这不是关于分支名称的问题。在Git中,它们不是有价值的货币。它们只是书签,有点像。在Git中重要的是提交,而克隆已经拥有了所有提交。虽然有一些例外情况,特别是浅层和/或单分支克隆,但总的来说,克隆会复制所有提交,而不会复制任何分支,这就完成了一次完整的复制,因为分支名称根本不重要。

作为一种快捷方式,可以使用git clone --mirror使克隆复制整个名称数据库。但是,如果您计划将其用作真正的镜像以外的其他用途,则需要进行一些小的克隆后调整。


结论

是否要删除存储库取决于是否要保留历史记录。在Git中,历史记录存储库中的提交集。我们通过从某个名称(分支名称、标签名称、远程跟踪名称或其他名称)开始,并让Git向后工作,如存储在提交中的历史记录一样,来查找这些提交。我们使用git checkout或(在2.23及更高版本中)git switch从提交中获取文件。(还有其他工具,如git archive,可以从提交中获取文件。检出和切换只是主要工具。)

要保留历史记录,请保留提交-即存储库。要开始新的历史记录,即只有一个新提交,请丢弃存储库-从工作树中删除.git目录-并使用git init创建一个新的存储库,然后添加您的文件并运行git commit。请注意,如果删除存储库,则会删除所有提交,因此历史记录现在已经丢失。(当然,原始存储库的任何其他克隆,在其他地方存储,仍将保留。)


0

如果您在运行 git init 命令之前从未运行过任何 git 命令,并且出现了此错误。您可以尝试删除项目文件夹中的 .git 文件。只需配置以显示隐藏文件夹即可。这对我有帮助。


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