首页 > 解决方案 > 将本地现有目录连接到现有 Git 远程存储库

问题描述

这是我的场景:

用户有一个本地目录,其中包含许多文件和文件夹。此本地目录与远程存储库中已存在的存储库相同。但是这个本地目录不在 git 源代码控制之下。

我想知道是否有一种方法可以让用户将这个本地目录关联到那个远程存储库。

** 我意识到一个肮脏的解决方案是在本地创建一个新文件夹并将其与远程存储库相关联,然后将所有现有文件移动到该新文件夹中,但我想知道这是否是唯一的方法,或者是否有是一个特定的命令或过程,它不是“黑客”。

需要明确的是,这个用户的本地文件夹可能在他的本地目录中有一些更改,文件可能需要推送到远程,以免丢失。

我通常使用 sourcetree 但这不是我认为的要求。

标签: gitatlassian-sourcetree

解决方案


它可以“就地”完成;尽管如此,我不能说你是否会认为这种方法是一种黑客行为,但它是我能想到的最直接的方法......

首先,听起来他的工作副本根本不是 git repo。在这种情况下,您可以在他的工作树上“就地”创建 git repo

git init

此时,他的工作副本将在这个新的 repo 中显示为未跟踪的文件。现在将 repo 与 origin 关联并获取历史记录。

git remote add origin <origin-url>
git fetch

<origin-url>您将用于克隆的相同网址在哪里。

此时,您仍然有一个“未出生”的master分支,并且没有其他本地分支;您仍然拥有本地工作副本作为未跟踪的更改;并且您对遥控器上的所有内容都有远程跟踪参考。

接下来我要做的事情是

git add .
git diff origin/master

(我在这里假设,如果本地版本是代码的修改副本,则它是origin/master.那次提交。我origin/master现在将继续假设,但如果这是错误的,请随时发表评论,我可以尝试相应地更新。)

在这里,我们填充索引并将其与远程版本进行比较,因为如果没有什么不同,那么你就完成了。只需擦除索引和工作树并结帐master(这将创建本地master并将其设置为 track origin/master)。

但听起来你不这么认为;所以如果你确实看到了差异,你需要创建一个新的提交。稍微棘手的部分是git要了解这个新状态只是现有origin/master提交的子状态。

有几种方法可以做到这一点,我相信对于哪种方式最好,意见会有所不同。一种简单的方法(但它确实使用了一些不太熟悉的命令)是

git merge $(git commit-tree -p origin/master -m "Commit Message" $(git write-tree))

...这可能需要一点解释。

所以首先这会TREE根据索引创建一个新的(项目内容的快照)。因为我们做了一个git add .before doing git diff,所以索引反映的是本地版本。TREE这会将新对象的 ID 打印到标准输出。

我们将该 ID 传递给git commit-tree,它COMMIT使用给定的父对象(我再次假设origin/master)、提交消息(在 之后填写适当的内容-m)和TREE(我们刚刚从索引创建的那个)创建一个对象。COMMIT这会将新对象的 ID 打印到标准输出。

然后我们将新COMMIT对象合并到当前(未出生的)master分支中,这有点奇怪,但就像快进到指定的COMMIT. 所以现在你有

x -- x -- O <--(origin/master)
           \
            L <--(master)

whereL将具有与本地副本相同的内容;所以看起来就像您从本地开始O并进行了本地更改。此时您可以push正常使用。


推荐阅读