Git远程'set-url'命令更改多个文件夹的URL

时间:2019-03-19 09:37:00

标签: git version-control

我有一个名为“ 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”文件夹看起来像是一个存储库,而不是其中几个存储在一个文件夹中。问题是如何改变这种行为。

1 个答案:

答案 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%明确说明的,因为您对重新克隆过程中发现的内容知之甚少,后续步骤取决于您发现的内容。