与 Subversion 不同,git 没有cp
命令。对于文件来说,这不是问题:如果我想将文件复制a
到b
,我只需执行以下操作:
cp -a a b
git add b
但是,假设我想复制一个目录d
并给它另一个名称e
。我仍然可以做同样的事情。但是,d
可能包含 git 未跟踪的文件,例如编译的二进制文件等。在这种情况下,我不想执行上述操作,因为我不想让 git 跟踪这些额外的文件。
使用 Subversion,我可以做到这一点svn cp
,它只会复制和添加由 Subversion 跟踪的文件。我怎样才能用 git 做到这一点?
答案1
您可以使用 git 克隆:
$ git clone /path/to/project /target/path
然后删除 .git 文件
$ rm -R /target/path/.git
答案2
- 找到“d”的树形哈希(git ls-tree HEAD d)
- git read-tree -u --prefix=e 树哈希
完毕!
git read-tree
允许您用您知道哈希值的任何树对象替换索引或(如本例中)其子树。-u
之后从索引中检出子树(就像您已执行一样git checkout -- e
)。有关树对象和索引的更多信息,请参阅Pro Git 书籍。
答案3
正确的解决方案就是确保忽略所有未跟踪的文件.gitignore
。
在这种情况下,当您复制目录并在副本上cp -Ra d e
运行时,git 将足够智能,避免添加它忽略的文件。git add e
答案4
cd
进入目录d
并执行
$ git checkout-index --prefix=e/ -- *
找到d
复制到e
(e
相对于 repo 根目录) 中由 git 跟踪的所有内容。