我有我的Git存储库,它在根目录下有两个子目录:
/finisht
/static
Run Code Online (Sandbox Code Playgroud)
当这是在SVN,/finisht在一个地方签出,而/static在其他地方查出来,像这样:
svn co svn+ssh://admin@domain.com/home/admin/repos/finisht/static static
Run Code Online (Sandbox Code Playgroud)
有没有办法用Git做到这一点?
如何从GitHub上托管的远程Git仓库中仅下载特定文件夹或目录?
举个例子说GitHub repo住在这里:
git@github.com:foobar/Test.git
Run Code Online (Sandbox Code Playgroud)
其目录结构:
Test/
??? foo/
? ??? a.py
? ??? b.py
??? bar/
??? c.py
??? d.py
Run Code Online (Sandbox Code Playgroud)
我只想下载foo文件夹而不是克隆整个Test项目.
我正在使用包含大量文件的存储库,这需要几个小时才能结账.我正在研究Git是否能够很好地使用这种类型的存储库,因为它支持稀疏检出,但我能找到的每个示例都执行以下操作:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
Run Code Online (Sandbox Code Playgroud)
这个命令序列的问题是原始克隆也执行结帐.如果将-n添加到原始克隆命令,则read-tree命令会导致以下错误:
错误:稀疏结账不会在工作目录上留下任何条目
如何在不先检出所有文件的情况下进行稀疏结账?
是否有可能只在Git和Mercurial中克隆一个分支(或来自给定的提交)?我的意思是,我想要克隆一个中央回购,但由于它很庞大,我只想获得它的一部分,并且仍能够回馈我的变化.可能吗?比如,我只想从Tag 130开始或类似的东西?
如果是这样,怎么样?
使用Git 1.7.0中新的稀疏结账功能,是否可以像在SVN中一样获取子目录的内容?我找到了这个例子,但它保留了完整的目录结构.想象一下,我只想要'perl'目录的内容,而没有名为'perl'的实际目录.
- 编辑 -
例:
我的git存储库包含以下路径
repo/.git/
repo/perl/
repo/perl/script1.pl
repo/perl/script2.pl
repo/images/
repo/images/image1.jpg
repo/images/image2.jpg
repo/doc/
repo/doc/readme.txt
repo/doc/help.txt
Run Code Online (Sandbox Code Playgroud)
我想要的是能够从上面的存储库中生成这种布局:
repo/.git/
repo/script1.pl
repo/script2.pl
Run Code Online (Sandbox Code Playgroud)
然而,使用当前的稀疏结账功能,似乎只能获得
repo/.git/
repo/perl/script1.pl
repo/perl/script2.pl
Run Code Online (Sandbox Code Playgroud)
这不是我想要的.
我想结帐到其他分支,或以前的提交,但我想保持一个文件夹相同的文件(不签出文件夹).
我希望该文件夹将显示在git status,所以我现在可以将此文件夹添加到索引中.
例如,我有一个文件夹node_modules.我希望文件夹在我的所有提交中(我知道大多数人更喜欢.gitignore node_modules文件夹).但是当我转移到其他提交或检查其他分支时,我希望它git不会触及该node_modules文件夹.
可能吗?
我启用了稀疏结账
git init
git remote add <url>
git config --global core.sparseCheckout true
echo "assets" >> .git/info/sparse-checkout
git pull origin master
Run Code Online (Sandbox Code Playgroud)
Git只为我检查了资产文件夹
但是现在,我想再次启用完整的分支机构检查(签出文件夹/文件),但它似乎不起作用.
1)首先我禁用了配置
git config --global core.sparseCheckout false
Run Code Online (Sandbox Code Playgroud)
2)删除.git/info/sparse-checkout中的条目
但git没有为我检查任何其他文件夹/文件,似乎它坚持'资产'文件夹.
谁能告诉我如何在不创建新仓库的情况下重置/禁用此稀疏结账.
Git 2.17更新日志描述了此选项:
- 有人介绍了克隆和获取的机制,这又涉及包装和拆包对象,该机器已被告知如何使用
另一个主题引入的过滤机制来省略某些对象。现在
,它知道将生成的包标记为允诺包,以容忍丢失的
对象,为“狭窄”克隆奠定基础。
这个标志准备好使用了吗,还是很有可能很不稳定?有谁知道正确的语法通过?我通过的所有标志都被视为无效的过滤器规范而被拒绝。例如,这些是我尝试按目录过滤的:
git clone file://path --depth=1 --filter '--subdirectory-filter Assets' TestRepo
git clone file://path --depth=1 --filter --subdirectory-filter Assets TestRepo
git clone file://path --depth=1 --filter Assets TestRepo
Run Code Online (Sandbox Code Playgroud) 根据Subdirectory Checkouts with git sparse-checkoutgit read-tree -mu HEAD在已存在存储库的情况下配置稀疏结帐后调用一次,即:
# Enable sparse-checkout:
git config core.sparsecheckout true
# Configure sparse-checkout
echo some/dir/ >> .git/info/sparse-checkout
echo another/sub/tree >> .git/info/sparse-checkout
# Update your working tree:
git read-tree -mu HEAD
Run Code Online (Sandbox Code Playgroud)
read-tree更详细地解释一下这个步骤吗?read-tree而不是,让我们说,checkout?-mu(为什么这是一个合并,什么是合并)?-m
Run Code Online (Sandbox Code Playgroud)Perform a merge, not just a read. The command will refuse to run if your index file has unmerged entries, indicating that you have not finished previous merge …
我昨天开始使用 Git,在此之前我已经使用 SVN 多年了。让我向您解释一下我到底想实现什么目标:
我有一个针对不同项目的主要 git 存储库。像这样的东西:
我无法为这些子项目创建单独的存储库。现在我(或其他用户)应该能够在这些独立项目中签出/提交/推送/拉取。
为此,我尝试使用以下命令进行稀疏结帐:
mkdir proj1; cd proj1git initgit remote add origin https://main_repogit config core.sparsecheckout trueecho "proj1/" > .git/info/sparse-checkoutgit pull origin master现在我需要的是获取 proj1 中同一当前目录中存在的所有文件。我得到的是这样的:
/proj1/proj1/files_and_dirs_in_proj1
Run Code Online (Sandbox Code Playgroud)
我需要的:
/proj1/files_and_dirs_in_proj1
Run Code Online (Sandbox Code Playgroud)
其次,checkout-dir 的行为不像 git repo。它不带有任何 .git 目录。所以我不明白如何在稀疏签出项目中进行提交/推/拉。
我希望我解释得很好。请建议。
git ×10
repository ×2
directory ×1
file ×1
git-checkout ×1
git-clone ×1
github ×1
mercurial ×1
subdirectory ×1