将文件/文件夹从一个git仓库移动到另一个仓库

时间:2014-03-05 19:41:10

标签: macos git github

我在Github上有一个包含文件夹和文件的现有存储库,我刚刚创建了四个新的存储库。

我希望将现有存储库中的文件/文件夹分发到我刚刚创建的新存储库中。

我有没有办法使用GUI或CMD(Macbook)?

1 个答案:

答案 0 :(得分:2)

我不知道是否有任何方法可以使用GUI。

如果要提取的内容包含在自己的文件夹中,则在命令行中非常简单。这里解释了使用git filter-branch --subdirectory-filter的一种方法:

https://stackoverflow.com/a/12818479/955926

如果您的文件和文件夹不是很好地包含,或者与简单模式不匹配(即只保留* .py文件等),一种方法 - 我称之为“修饰” - 就是继续运行简单的filter-branch命令 - 在克隆上,而不是原始! - 继续剥离它的一部分,直到你的历史只包含你想要的东西。

当然,我们总是希望能够验证我们正在做什么。这将显示您的仓库中曾存在的所有相关文件/文件夹路径的已排序,单一的列表:

$ git log --pretty='format:' --name-only | grep -v '^$' | sort -u

让我们在该列表中说明您希望从历史记录中删除foobar/baz个文件夹(即删除baz中的bar,{ {1}}):

foo

现在,您可以运行上一个$ git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch foo bar/baz' 命令来验证这些链接在任何时间都不存在,并从该较小的列表中选择更多内容来摆脱。或者你可以将每条路径都粘贴到filter-branch的一个调用中。我觉得更好地采取更小的步骤并进行验证,就像我更精确地提交一样。

Filter-branch每次都会进行备份,第二次运行会因其存在而暂停。这就是log的用途。每次再次过滤时,你都会覆盖你的备份,但是没关系,因为你在克隆上做这个(对吧!?),如果搞砸了,你总是可以在新的克隆上再做一次。

最后,您需要清除-f个头部,这些头部将指向您在每次传递后过滤的分支的最后一个头部。如果您对refs/original/*分支进行过滤分支,则会有一个master文件指向旧的主文件头,预过滤。当您强制下一个传递时,您将指向新传递。如果出于某种原因,您希望在每次过滤后保留指向每个备份的指针,只需在每次传递后将分支或标记放在那些“原始”引用上。或者在过滤之前删除标记/分支,或者只使用reflog。