两个远程存储库,不同的forlders

时间:2016-06-28 23:49:15

标签: git git-remote

我有一个git存储库:

存储库A:

config
  view1.yml
  view2.yml
public
  css/
    styles.css
  js/
    scripts.js
  index.html

我想添加另一个远程存储库,但只是跟踪公用文件夹的内容,例如:

存储库B:

css/
  styles.css
js/
  scripts.js
index.html

我怎么能在当地做到这一点?与git remote add

3 个答案:

答案 0 :(得分:1)

如果所有内容都在您要导出的目录下,并且您确实要省略其他所有内容,则可以使用git filter-branch过滤掉分支,然后将该结果分支推送到Repo B。

从您感兴趣的分支机构的一角,假设您想要保持对“公共”及以下目录的更改:

git checkout -b nameOfPublicBranch
// Create a new branch where you want to start to filter

git filter-branch -f --subdirectory-filter public
// This filters your branch down to commits that modified public (and below)

git push repoB nameOfPublicBranch
// now export to repoB just this stuff that you wanted on your branch nameOfPublicBranch

git checkout <yourOldBranchName>
// get back to your old branch

如果你想在分支nameOfPublicBranch上将提交压缩成一个,那么在你推送它之前在它上面做一个rebase squash。

可能有很多其他方法可以解决这个问题,其中一种可能是使用子模块,这种方法可能会出现意外问题(重写历史记录)。

答案 1 :(得分:1)

看看git subtree。从他们的文档中解释了以下内容:

  

...子树允许子项目包含在子目录中   主项目,可选择包括子项目的整个项目   历史。

     

例如,您可以将库的源代码包含为   你的申请的子目录......

我会在某处创建新的裸存储库(git init --bare)并执行子树split命令以“分支”公用文件夹的历史记录。然后我会将此信息推送到您的其他存储库。此示例可以在上面链接的文档中看作Example 3

<go to the new location> 
git init --bare  
git subtree split --prefix=lib --annotate="(split)" -b split   
git push <new-repo> split:master

答案 2 :(得分:0)

也许您应该使用gitignore(告诉git忽略文件并且不跟踪它们),并使用以下内容(未经过测试):

*
!/css
!/js

如果您已经跟踪了文件,则需要在设置gitignore之前运行git rm --cached <file>

如果您想了解更多关于gitignore的信息,也许您想阅读git tutorial的this part