为什么 "cp -a" 不复制并保留所有 git 文件?

Why doesn't "cp -a" also copy and preserve all git files?

由于一些目录变化,我需要将我本地的开发目录复制到一个新的位置。此开发目录正在使用 git 同步到外部 git 存储库。最近有一些新的文件更改未提交并推送到该外部仓库。我的愿望是将所有内容复制到一个新目录并在我离开的地方继续 git'ing。

原目录中:

~/original_dir $ git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   .idea/misc.xml
    modified:   ...

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    ../README.md
    ...

no changes added to commit (use "git add" and/or "git commit -a")

完成 cp -a ~/original_dir ~/new_dir 后,我简单地得到:

~/new_dir $ git status

fatal: Not a git repository (or any of the parent directories): .git

检查显示副本的根目录中缺少 .git。这非常令人担忧,因为我一直在使用 cp -a 进行备份。这意味着不能相信 cp -a 可以复制所有内容。 (根据手册页,-a 是 "same as -dR --preserve=all"。)

获得该目录的准确快照的正确 cp 命令是什么?


注意: 使用 tar -cf old_dir.tar old_dir 然后提取它, 确实 产生一个精确的目录副本,也可以使用继续您上次中断的 git 操作。

感谢 OP 评论中的链接,我想我找到了两个答案。

(1) 显然我的 Bash 默认关闭了 dotglob shell 选项,它需要 on.

$ shopt 
...
dotglob         off
...

(2) 一个非常巧妙的技巧是在复制命令中指定一个尾随点,并且目标目录已经存在:

cp -a old_dir/. new_dir/

第二个我还需要测试。