将文件夹(以及其中的每个文件夹)从一个git repo复制到另一个

时间:2016-02-25 03:54:16

标签: git github

我找到了几个如何将文件夹从一个git repo移动到另一个git repo的示例[here's one]。然而,它似乎对原始回购具有破坏性(如果我正确地阅读它)。我需要的是只将一个文件夹从一个仓库复制到另一个仓库,再将另一个仓库复制到另一个仓库。如下所示:

<table>
    <tr>
        <td>Car</td>
        <td>Top Speed</td>
        <td>Price</td>
    </tr>
    <tr>
        <td>Chevrolet</td>
        <td>120mph</td>
        <td>$10,000</td>
   </tr>
   <tr>
       <td>Pontiac</td>
       <td>140mph</td>
       <td>$20,000</td>
   </tr>
</table>

副本之后,我希望它看起来像这样:

var array = [['Car', 'Top Speed', 'Price'],['Chevrolet', '120mph', '$10,000'], ['Pontiac', '140pmh', '$20,000']] // Creating a data array which a loop will source from

    var table = document.createElement('table');
    document.body.appendChild(table); // Drew the main table node on the document

    for (var i = 0; i<3; i++) { 
        var tr[i] = document.createElement('tr'); //Create 3 <tr> elements assigned to a unique variable BUT need a working alternative for 'tr[i]'
        table.appendChild(tr[i]); // Append to <table> node

        for (var j = 0; j<3; j++) {

            var tdText = document.createTextNode(array[i][j]); // Extract data from array to a placeholder variable
            tr[i].appendChild(tdText); // Take string from placeholder variable and append it to <tr> node
        }
    }

我可能会摆脱原始的部署文件夹,但想要保留它,直到我知道我们已经清楚了。

我猜这是可能的,而我只是盲目的。如果不是,我可以手动移动文件。丢失所有历史但捕获当前状态。但这不太理想。

1 个答案:

答案 0 :(得分:1)

您可以通过git subtree命令执行此操作(内置一段时间;之前在contrib中提供):

  1. 在回购中使用git subtree split -P myApp/deploy&#34; A&#34;创建一个仅包含该内容的合成历史记录&#34; myApp / deploy&#34;文件夹中。
  2. 将生成的提交提取到repo&#34; B&#34;。
  3. 使用git subtree add -P myDeploymentCode/projects/myApp ...来&#34;植物&#34;使用合并提交的历史记录。
  4. 结果的唯一问题是,提取的历史记录行中的所有提交 - 除了将其与新代码库合并的提交 - 都不会记录其中的文件位于&#34; myDeploymentCode /下的事实项目/对myApp&#34;前缀so命令跟踪路径名或路径名前缀的历史记录,如

    git log -- myDeploymentCode/projects/myApp/foo.txt
    

    可能无法超越那个&#34;种植&#34;的合并提交。提取的历史记录到新的代码库中(在这个例子中,文件&#34; foo.txt&#34;将在那些提交中存在但位于顶层而不是在该前缀下)。

    如果您对此感到满意,那就去做吧。另外,您可能需要首先对提取的历史记录运行git filter-branch加密,以重写构成它的所有提交,使其文件位于历史将被种植的新的预期前缀下。

    一种方法是

    git filter-branch -f --tree-filter \
           'test -e myDeploymentCode/projects/myApp || mkdir -p myDeploymentCode/projects/myApp
           find . -mindepth 1 -maxdepth 1 \
               -type d -path ./myDeploymentCode -prune -o -print \
           | xargs -n 30 mv -t ./myDeploymentCode/projects/myApp' temp
    

    (假设您已经创建了一个名为&#34的分支; temp&#34;在提交git subtree split的SHA-1名称中,在步骤(1)中告诉您。)

    请参阅this获取相同的示例,并附上有关其工作原理的深入说明。

    值得注意的是,历史git subtree split产生的是合成的,,即包含它的提交的SHA-1名称在源存储库中不存在。那些熟悉Git内部的人很明显 - 而 blob 被提取的历史记录重用, tree commit 对象不是 - 但请注意以防万一。