为什么 "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/
第二个我还需要测试。
由于一些目录变化,我需要将我本地的开发目录复制到一个新的位置。此开发目录正在使用 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/
第二个我还需要测试。