以下是我的情景:
用户的本地目录中包含许多文件和文件夹。此本地目录与远程仓库中已存在的存储库相同。但是这个本地目录不在git源代码控制之下。
我想知道用户是否能够将此本地目录与该远程存储库相关联。
**我意识到对此的一个肮脏的解决方案是在本地创建一个新文件夹并将其与远程存储库关联,然后将所有现有文件移动到该新文件夹中,但我想知道这是否是唯一的方法或者如果有一个特定的命令或过程不是“黑客”。
要明确的是,此用户本地文件夹可能在其本地目录中有一些更改,可能需要将文件推送到远程,以便它们不会丢失。
我一般都使用sourcetree,但这不是我觉得需要的东西。
答案 0 :(得分:2)
可以“到位”完成;我不能说你是否会认为这种做法是一种黑客行为,但这是我能想到的直接方法......
首先,听起来他的工作副本根本不是git repo。在这种情况下,您可以在其工作树上“就地”创建git repo
git init
此时,他的工作副本将在此新仓库中显示为未跟踪的文件。现在将repo与origin相关联并获取历史记录。
git remote add origin <origin-url>
git fetch
其中<origin-url>
与您用来克隆的网址相同。
此时,你仍然有一个“未出生的”master
分支,没有其他本地分支;您仍然可以使用本地工作副本作为未跟踪的更改;并且您可以远程跟踪遥控器上的所有内容。
接下来我要做的是
git add .
git diff origin/master
(我在这里假设,如果本地版本是代码的修改副本,则会修改来自 origin/master
上的内容。如果没有,那么您至少需要知道什么是“正确的”父提交,并替换对该提交的引用。我现在将继续假设origin/master
,但如果这是错误的话我可以随意评论,我可以尝试相应地更新。)< / p>
这里我们填充索引并将其与远程版本进行比较,因为如果没有什么不同,那么你就完成了。只需擦除索引和工作树并结帐master
(将创建本地master
并将其设置为跟踪origin/master
)。
但听起来你不认为是这样的;所以如果你做看到差异,你需要创建一个新的提交。稍微棘手的部分是让git
理解这个新状态只是现有origin/master
提交的子状态。
有几种方法可以做到这一点,我确信意见会因哪种方式最好而有所不同。一个简单的方法(但确实使用一些不太熟悉的命令)将是
git merge $(git commit-tree -p origin/master -m "Commit Message" $(git write-tree))
......这可能有点解释。
首先,这将根据索引创建一个新的TREE
(项目内容的快照)。因为我们在执行git add .
之前做了git diff
,所以索引反映了本地版本。这将打印到标准输出新TREE
对象的ID。
我们将该ID传递给git commit-tree
,它创建了一个具有给定父级的COMMIT
对象(我再次假设origin/master
),提交消息(在{{之后填写适当的内容) 1}})和-m
(我们刚从索引创建的那个)。这将打印到标准输出新TREE
对象的ID。
然后我们将新的COMMIT
对象合并到当前(未出生的)COMMIT
分支中,这是一个有点奇怪的事情,但就像快速前进到指定的master
一样。所以现在你有了
COMMIT
其中x -- x -- O <--(origin/master)
\
L <--(master)
的内容等于本地副本;所以它看起来就像你从L
开始并进行了本地更改。此时您可以正常O
。