我有一个名为“ Py”的文件夹,用于存储所有Python项目。开始时,一切正常,因为我创建了项目文件夹并将它们设置为不同的原始URL。该“ Py”文件夹中的每个文件夹都链接到其自己的Git存储库。
然后,我不知道发生了什么,但是我注意到通过更改子文件夹之一中的url,父文件夹中其他子文件夹的所有url也会改变。例如,我转到“ Py / folder1”子文件夹并执行
git remote set-url origin 'some-url'
然后我转到“ Py / folder2”,执行
git remote -v
然后看到该子文件夹的url也更改为'some-url'。我怀疑以某种方式使整个“ Py”文件夹看起来像是一个存储库,而不是其中几个存储在一个文件夹中。问题是如何改变这种行为。
答案 0 :(得分:0)
如果有
.../
parent/
project1/
project2/
他们都共享remote
配置,那么最可能的情况是
(1)存在一个目录.../parent/.git
,该目录将parent
及其所有子文件夹映射为单个存储库的工作树
(2)不存在目录.../parent/project1/.git
或.../parent/project2.git
,它们会将每个proejct文件夹映射到其自己的git repo
如果它们以前表现为独立的回购协议,但现在不再充当独立存储库,那么似乎以某种方式创建了parent/.git
目录(也许通过git init
),和其他.git
个目录已删除。
快速免责声明:我发现项目的.git
文件夹被意外删除的可能性很小。后面的建议采用的情况是按面值列出的,因此,如果问题中提出的观察结果不正确,或者遗漏了一些“小细节”,则该建议无效。
这表示...如果上述情况确实发生了,那么.git
目录的删除将导致大量数据丢失(至少在本地)。幸运的是,可以将git remotes视为本地数据的大部分的一种“备份”,因此,如果您最近与每个项目的remote同步,则可以轻松进行恢复
所以我要做的第一件事就是暂时不让parent
,创建一个新的父目录(例如.../parent2
)。在该目录中,从远程目录为每个项目存储库创建新的克隆。
接下来,您将parent2
下每个项目目录中的内容与parent
下相应目录中的内容进行比较。 (您可以使用git diff
或其他诸如Beyond Compare的质量差异工具。)从那里开始的操作取决于所找到的内容。
如果所有项目都相同,那么看来您很幸运;您也许可以擦除旧的parent
文件夹,然后将项目从新的parent
文件夹移回到其原始位置,然后从那里继续。
如果存在差异,则可能必须查看是否在遥控器中没有本地更改,遥控器是否有您本地没有的更改或两者。不在远程中的本地更改可能会捕获到您在parent
当前对(显然是偶然的)monorepo的提交中-在这种情况下,可以使用git filter-branch
和--parent-filter
来提取它们,并且然后迁移到各个项目存储库中,以任何有意义的方式进行合并。否则单个更改可能会丢失,您可能只需要更新单个存储库的状态以反映您的最新更改。
还有一个特殊的考虑因素-可能是一个(或多个)新克隆的副本包含整个parent
结构。如果您在某个时候将parent
存储库的URL设置为特定项目的URL,则可能会发生这种情况。搜索历史记录可能会揭示发生这种情况的时间点。
这些清理过程都不是100%明确说明的,因为您对重新克隆过程中发现的内容知之甚少,后续步骤取决于您发现的内容。