代码之家  ›  专栏  ›  技术社区  ›  jvoigt

将本地现有目录连接到现有Git远程位置

  •  0
  • jvoigt  · 技术社区  · 7 年前

    以下是我的场景:

    用户有一个本地目录,其中包含许多文件和文件夹。此本地目录与远程repo中已存在的存储库相同。但此本地目录不受git源代码管理。

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

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

    要明确的是,此用户的本地文件夹可能在其本地目录中有一些更改,可能需要将文件推送到远程,以便它们不会丢失。

    我通常使用sourcetree,但我觉得这不是一个要求。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mark Adelsberger    7 年前

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

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

    git init
    

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

    git remote add origin <origin-url>
    git fetch
    

    哪里 <origin-url> 与用于克隆的url相同。

    此时,您仍有一个“未出生” master 分行,无其他地方分行;您仍将本地工作副本作为未跟踪的更改保存;您可以对远程上的所有内容进行远程跟踪引用。

    接下来我要做的是

    git add .
    git diff origin/master
    

    (我在这里假设,如果本地版本是代码的修改副本,那么它会被修改 从…起 正在播放什么 origin/master 。如果不是,那么您至少需要知道“正确”的父提交是什么,并替换对该提交的引用。我会继续假设 原点/主 目前,如果这是错误的,请随时发表评论,我可以尝试进行相应的更新。)

    这里我们填充索引并将其与远程版本进行比较,因为如果没有什么不同,那么就完成了。只需擦除索引和工作树并签出即可 主人 (这将创建本地 主人 并将其设置为跟踪 原点/主 )。

    但听起来你不这么认为;所以如果你 请参阅差异,您需要创建一个新的提交。稍微棘手的部分是 git 要理解这个新状态只是现有状态的子状态 原点/主 犯罪

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

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

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

    首先,这会创建一个新的 TREE (项目内容的快照)基于索引。因为我们做了 git add . 在执行之前 git diff ,索引反映本地版本。这会将新的 对象

    我们把身份证传给 git commit-tree ,这将创建 COMMIT 对象与给定的父对象(我再次假设 原点/主 ),提交消息(在 -m ),和 (我们刚刚从索引创建的)。将打印到标准输出的新 犯罪 对象

    然后我们合并新的 犯罪 对象到当前(未出生) 主人 branch,这是一件有点奇怪的事情,但它的工作方式就像快进到指定的 犯罪 .所以现在你有

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

    哪里 L 内容与本地副本相同;看起来就像你从 O 并进行了局部更改。你可以 push 通常在这一点上。