是否有一个“git cp”命令可以仅复制跟踪的文件,就像“svn cp”一样?

是否有一个“git cp”命令可以仅复制跟踪的文件,就像“svn cp”一样?

与 Subversion 不同,git 没有cp命令。对于文件来说,这不是问题:如果我想将文件复制ab,我只需执行以下操作:

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

  1. 找到“d”的树形哈希(git ls-tree HEAD d)
  2. 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 跟踪的所有内容。

相关内容