Похоже, вы хотите, чтобы файлы попадали в / var / www / website / index .html
, но с указанным выше синтаксисом они окажутся в /var/www/website/repo/index.html
.
Вы можете проверить, действительно ли это происходит, проверив, есть ли у вас каталог / var / www / website / repo /
с новыми файлами.
Решением было бы использовать что-то вроде cp -R source / * dest /
или, возможно, rsync -a source / dest /
, чтобы быть более эффективным.
Я рекомендую попробовать sudo cp -Rf / home / git / repo / * / var / www / website
, мне всегда больше везло при копировании содержимого каталогов вместо каталогов.
Разрешения и право собственности могут иметь значение для ваших файлов, но если вам ничего не нужно, кроме 644
и 755
, принадлежащих одному владельцу, вы можете просто проверить прямо из Git :
git --git-dir=/home/git/repo/.git --work-tree=/var/www/website checkout -f HEAD
Флаг -f
принудительно выполняет проверку, в результате чего Git перезаписывает любые изменения в / var / www / website
версией, сохраненной в Git.
HEAD
, конечно же, указывает на идею Git о «текущей» фиксации.
Вы также можете изучить команду git worktree
, но, поскольку вы не будете выполнять разработку в / var / www / website
, приведенное выше вероятно более уместно.
Поскольку вы запускаете это от имени root (используя sudo
), вы проверили, есть ли псевдоним для cp
в .bashrc
или .profile
?
Что-то вроде:
alias cp="cp -i"
Попробуйте запустить команды с '\
', например так:
sudo \cp -R /home/git/repo /var/www/website
\
в \cp
заставит cp
работать без псевдонима.
cp
я предпочитаю использовать tar
для больших деревьев... Да, я почти никогда не использую синтаксис cp -r
(за исключением жесткой привязки резервных копий, с cp -al
, но это очень специфично).
Синтаксис tar допускает много тонких настроек для копирования большого дерева, о том, что может быть скопировано или нет (какие файлы, разрешения, владелец...) смотрите man tar
.
Я предпочитаю быть знакомым с командой tar
:
На localhost:
tar -cpC /path/to/source . | tar -xpC /path/to/target
(обратите внимание на точки .
, которые указывают что сохранять).
Знакомство с tar
может быть полезно для удаленного копирования:
ssh user@remotesource tar -zcpC /path/to/source . | tar -zxpC /path/to/target
или
tar -zcpC /path/to/source . | ssh user@targethost tar -zxpC /path/to/target
или даже
ssh user@remotesource tar -zcpC /path/to/source . |
ssh user@targethost tar -zxpC /path/to/target
На удаленных и/или разных хостах, при копировании учетной записи пользователя, вам могут понравиться опции --numeric-owner
...
--one-file-system
оставаться в локальной файловой системе--overwrite
перезаписывать существующие файлы-T, --files-from FILE
получать имена для извлечения или создания из FILE-z
использовать сжатие gziptar
, почему бы не использовать cpio
Как imz -- Иван Захарьящев прокомментировал, cpio
может делать то же самое, но не с тем же синтаксисом:
cpio
требует список inode (file, dir, dev, socket, fifo), которые должны храниться в archive, чтобы быть переданными STDIN
.
Но cpio
предлагает режим --pass-through
который позволяет копировать файл в другой каталог.
Это делает синтаксис сильнее, но так как мы использовали find
для построения этого списка, мы можем использовать возможности find
для копирования именно того, что нам нужно:
cd /path/to/source
find . \( -type f -o -type d \) ! -name '*.foo' -print0 |
cpio --null -pvd /path/to/destination
Используя удаленно, вы можете:
ssh user@remotesource /bin/sh <<<'cd /path/to/source;
find . \( -type f -o -type d \) ! -name '*.foo' -print0 |
cpio --null -o |
gzip' |
ssh user@targethost 'cd /path/to/destination && gunzip | cpio -id'