Git 能不能实现单个目录不可见,不可修改?只git 检出代码单个目录

让Git忽略所有obj和bin目录的同步 – blchen的空间
Recent Posts
Categoriesgit只clone仓库中拇指定子目录和指定文件的实现 - 研发管理_解决方案网当前位置:& &&&git只clone仓库中拇指定子目录和指定文件的实现2015git只clone仓库中拇指定子目录和指定文件的实现本文收集于网络,只用于方便查找方案,感谢源作者,如果侵权请联系删除git只clone仓库中指定子目录和指定文件的实现 从svn转git也有四五个月的时间了,期间也遇到过一些问题,但也深感git的强大,用者自知,这里就不在多言,git目前唯一不能实现的是:不能像svn那样,针对子目录设置权限,这与git分布式仓库的运行机制有关,svn是基于文件方式的集中存储,Git却是基于元数据方式分布式存储文件信息的,它会在每一次Clone的时候将所有信息都取回到本地,即相当于在你的机器上生成一个克隆版的版本库,既然本地有了完整的版本库,肯定就有所有权限了,所以也就没办法针对子目录的进行权限控制了。 今天说的问题和上边有点关系,理解了上边的内容,这个问题也就简单了:我们想做的是只拉取一个repository中的几个子目录的代码,而非整个库,从上文的说明中也能看出这是不能实现的,对,在git 1.7.0 之前是不能实现的,git认为如果这样做的话,仓库的数据一致性无法保证,即使你真的这样做,完全可以把这些不相关联的子目录放到不同的repository,repository之间是彼此独立的,仔细想想也很有道理。我的使用场景:1、想用一颗repository树来保存相互之间没有关联、没有依赖的运维子项目,而每个子项目代码量都很少,每一个子项创建一个repository太没有必要了;2、公司的所有内部api也想统一放置到一颗repository树上,几十个api不能都创建一个repository吧(我现在是这么认为的,这个需求也可能不太合理)。 如果非要只clone repository中的几个子目录的话,那就用sparse clone,git从1.7.0开始支持,sparse clone也只是一个变通的方法:先拿到整个repository的object等元数据信息,然后在本地加一个叫.git/info/sparse-checkout的文件(即黑名单、白名单,支持正则,参见下文具体操作命令)来控制pull那些目录和文件(类似.gitignore文件,都是本地的概念),变通的实现《git只clone仓库中指定子目录和文件》,如果非要完美的满足这个需求那就用svn吧。引用stackoverflow上对sparse clone的描述:Implementing something like this in Git would be a substantial effort and it would mean that the integrity of the clientside repository could no longer be guaranteed. If you are interested, search for discussions on &sparse clone& and &sparse fetch& on the git mailinglist.In general, the consensus in the Git community is that if you have several directories that are always checked out independently, then these are really two different projects and should live in two different repositories. You can glue them back together using&Git Submodules.具体做法:一、svn的实现:svn因为是基于文件的集中控制方式,所有“原生”就支持只checkout指定子目录,并且还能很好的对子目录进行权限控制? &svn-test &svn co /ops/内网服务器情况 & testA & &test/内网机器硬件配置详细A & &test/内网机器硬件配置详细/192.168.1.147.txtA & &test/最新全公司网络拓扑图.pngChecked out revision 251.? &svn-test? &svn-test &svn infoPath: .Working Copy Root Path: /Users/laijingli/svn-testURL: /ops/%E8%BF%90%E7%BB%B4%E6%96%87%E6%A1%A3Repository Root: /opsRepository UUID: e2-48da-bdf0-37bd7e579499Revision: 251Node Kind: directorySchedule: normal二、git的实现:基于sparse clone变通方法[root@vm_test backup]# mkdir devops[root@vm_test backup]# cd devops/[root@vm_test devops]# git init & &#初始化空库Initialized empty Git repository in /backup/devops/.git/[root@vm_test devops]# git remote add -f origin http://:90/scm/beeper/yunxxx_ops.git & #拉取remote的all objects信息Updating originremote: Counting objects: 70, done.remote: Compressing objects: 100% (66/66), done.remote: Total 70 (delta 15), reused 0 (delta 0)Unpacking objects: 100% (70/70), done.From http://192.168.1.1:90/scm/beeper/yunxxx_ops&* [new branch] & & &master & & -& origin/master[root@vm_test devops]# git config core.sparsecheckout true & #开启sparse clone[root@vm_test devops]# echo &devops& && .git/info/sparse-checkout & #设置需要pull的目录,*表示所有,!表示匹配相反的[root@vm_test devops]# more .git/info/sparse-checkoutdevops[root@vm_test devops]# git pull origin master &#更新From http://192.168.1.1:90/scm/beeper/yunxxx_ops&* branch & & & & & &master & & -& FETCH_HEAD[root@vm_test devops]# lsdevops[root@vm_test devops]# cd devops/[root@vm_test devops]# lsmonitor_in_web &test.1截图:很赞的几篇参考文章(作为后辈,你遇到的很多问题前辈们早已遇到,并且很多已经有了完美的解决方案,做技术一定要勤于google啊):/questions/600079/is-there-any-way-to-clone-a-git-repositorys-sub-directory-only/blog/subdirectory-checkouts-with-git-sparse-checkout/http://schacon.github.io/git/git-read-tree.html#_sparse_checkout/articles/QjEvQvr
版权声明:本文为博主原创文章,未经博主允许不得转载。
上一篇:下一篇:
File: 0:14:53使用git的subtree将已有项目的某个目录分离成独立项目 | 缺氧空间
使用git的subtree将已有项目的某个目录分离成独立项目
git在1.8版本后加入了subtree的功能,这个功能比之前的submodule功能强大很多,而且很好用,还是老版本的赶紧升级下吧。
一些使用方法可参见这个页面:
当一个项目在开发若干时间后,希望将某个目录单独出一个项目来开发,此时就可以利用这个subtree的功能分离里。
然而直接用git subtree add 的命令会出现 prefix ‘***’ already exists. 这样的错误提示,
这是因为对应的目录已经存在,不能直接添加,需要按下面的方式把对应的目录剥离开然后再加入subtree
具体的操作方式是这样的:
1. 首先cd到需要处理的项目的目录:
pushd &big-repo&
git subtree split -P &name-of-folder& -b &name-of-new-branch& & &# 将需要分离的目录的提交日志分离成一个独立的临时版本
2. 创建一个新的repo
mkdir &new-repo&
pushd &new-repo&
git pull &/path/to/big-repo& &name-of-new-branch&
3. 连接的github
git remote add origin &git@</:my-user/new-repo.git&
git push origin -u master
其中第2, 3两步也可以直接clone已有的hub,这样做:
git clone &git@</:my-user/new-repo.git& &dir-of-tmp-repo&
git pull &/path/to/big-repo& &name-of-new-branch&
git push origin -u master
4. 清理数据
popd # get out of &new-repo&
pushd &big-repo&
git rm -rf &name-of-folder&
git commit -m '移除相应模块' & & & & & &# 提交删除申请
git branch -D &name-of-new-branch& & & # 删除临时分支,也可以不移除,自己看情况
5. 添加subtree
git subtree add -P &name-of-folder& &git@</:my-user/new-repo.git& master
git push origin master
执行到第3步时,对应的目录已经剥离出来形成独立的项目了。第4,5步主要是把当前项目的对应的文件给删除,可以不执行,以后可以通过
git subtree pull -P &name-of-folder& &git@</:my-user/new-repo.git& master
git subtree push -P &name-of-folder& &git@</:my-user/new-repo.git& master
来执行相应的subtree操作如何 git push 或者 merge 指定的几个文件_百度知道
如何 git push 或者 merge 指定的几个文件
4,用来记录其他数据, 那也可以,3, 如何实现。 如果merge 能够 实现? 谢谢,5 这几个文件。
而我仅想push 1和3,3; 剩下的几个文件 都是系统自动生成的。 我每次修改和更新 也仅限于 1,2比如 repository 中 有 1
能否 修改类似配置文件 来 指定呢哦 git add 虽然可以指定几个文件, 不可能 都列举上。 但是 push 的特定文件 比较多
提问者采纳
it add 1 3git commitgit push这个操作后只会提交1 和 3,以后就不会检测那些文件的状态把要忽略的文件提那家到,如果其他文件比较麻烦你可以直接将他们加入忽略,这个文件要跟.git文件夹在同一级目录,其他文件不会提交.gitignore这文件就好了
非常感谢! 多个文件 还是 .gitignore 来的方便。
提问者评价
软件工程师
其他类似问题
为您推荐:
merge的相关知识
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 git 检出 的文章

 

随机推荐