子目录内容的sparceCheckout检出父文件夹

时间:2017-01-04 21:38:36

标签: git

这是我跑的:

git init &&
git remote add -f origin <repository-url> &&
git config core.sparseCheckout true &&
echo "app/folder/*" >> .git/info/sparse-checkout &&
git pull --depth=1 origin master && ls -la

我的期望:

file1
file2
file3

我得到了什么:

app/ 
 └── folder/
       ├── file1
       ├── file2
       └── file3

对于那些好奇的人来说,它正在跳过一些文件。存储库看起来像:

root/
├── some_file
├── something_else 
└── app/ 
     ├── some_other_file
     ├── some_other_folder/
     └── folder/
           ├── file1
           ├── file2
           └── file3

我看过很多stackoverflow的答案。 我做错了什么?

1 个答案:

答案 0 :(得分:1)

感谢您提出的一个好问题:您确切地说出了您的所作所为,正是您希望看到的内容,以及您所看到的内容。这只是所以罕见。谢谢。

你想要的并不是真的做得太多,它比稀疏结账要少得多。没有任何便利命令可以自动设置它。幸运的是,Git无论如何都可以做到,你只需要直接使用一些核心命令并设置一些选项。

要做你想做的事,首先要清理稀疏结账:

git read-tree -um `git mktree<&-`        # clean out the index and worktree
git config core.sparsecheckout false     # shut off sparse checkout

现在检查你的分支,好像你不打算重组一切:

git checkout -b appfolder --track origin/master

现在只读取你想要的子树:

git read-tree -um @:app/folder
git commit -m 'Isolating the app/folder subtree'

现在告诉git merge(和git pull)每次合并到此分支时都要进行子树隔离:

git config branch.appfolder.mergeoptions -Xsubtree=app/folder

这将为你设置一个分支

  

仅将“文件夹”的内容签入到运行命令的目录中,当我执行git pull时,我只希望更新这些文件

当/如果你要合并回主人,你可以指定相同的-Xsubtree=app/folder并且git会发现你正在走另一条路。

注意:即使一次完整的结账太痛苦了 - 说它有一万个文件而且你有一个糟糕的旋转生锈的笔记本电脑驱动器15毫秒寻求5400rpm或类似的东西 - 你可以通过用

替换上面的结账来避免它
git checkout -b appfolder                      # name the current checkout
git branch --set-upstream-to origin/master     # set its upstream ref
git reset --soft origin/master                 # and its parent commit