20 марта 2015, 11:59

Поговорим о рекурсии

Начинаешь, например, клепать вёрстку чего-нибудь:

~|⇒  mkdir test
~|⇒  cd test
~/test|⇒  touch index.html
~/test|⇒  touch style.css
~/test|⇒  mkdir css
~/test|⇒  mv style.css css
~/test|⇒  ls -al
total 0
drwxr-xr-x   5 rschweppes  staff   170 20 мар 11:11 .
drwxr-xr-x+ 86 rschweppes  staff  2924 20 мар 11:12 ..
drwxr-xr-x   3 rschweppes  staff   102 20 мар 11:11 css
-rw-r--r--   1 rschweppes  staff     0 20 мар 11:11 index.html

Клепает-клепает, а потом решает сделать вторую версию вёрстки из первой в подпапке v2, но не с нуля, а из копии этих файлов.

Для этого надо создать эту папку и скопировать в неё все файлы:

~/test|⇒  mkdir v2
~/test|⇒  cp -R * v2

В результате этой, на первый взгляд, логичной команды получаем паузу и такой результат:

Произошло следующее: папка v2 начала бесконечно копироваться в саму себя, создав длинное дерево

Так работает рекурсивный вызов команды cp, который, очевидно, нам не подходит.

Решение — rsync с параметром ‐‐exclude:

~/test|⇒  rsync -a --exclude=v2 * v2
~/test|⇒  tree
.
├── css
│   └── style.css
├── index.html
└── v2
    ├── css
    │   └── style.css
    └── index.html

3 directories, 4 files

И даже подпапку v2 заранее создавать не надо.

Кстати, если мы захотим не скопировать, а переместить содержимое папки в подпапку командой mv, получим более ожидаемый результат:

~/test|⇒  mv * v2
mv: rename v2 to v2/v2: Invalid argument

~/test|⇒  tree
.
└── v2
    ├── css
    │   └── style.css
    └── index.html

2 directories, 2 files

Так-то.

6 комментариев
Леонард Киндай

Тебе боженька системы контроля версий нахуя послал?

Дмитрий До́рошев

Боженька не предусмотрел, что я захочу показать две версии вёрстки: одну по адресу kinday.ru/kvn/, а другую по адресу kinday.ru/kvn/v2/

Леонард Киндай

$ mkdir -p /srv/kinday.ru/kvn
$ cd /srv/kinday.ru/kvn
$ git clone -b master git@github.com:kinday/kvn.git ./v1
$ git clone -b v2 git@github.com:kinday/kvn.git ./v2

Дмитрий До́рошев

А почему нельзя всё целиком хранить в одном репе?

Леонард Киндай

Потому что «...решает сделать вторую версию [...] не с нуля, а из копии...»

Дмитрий До́рошев

А если мне нужно видеть в истории гита, когда и из чего я родил вторую версию?
И ещё у меня есть две копии репозитория: локальная и удалённая, с одним репом я делаю один раз git push и один раз git pull, а с двумя — уже четыре раза понадобится команды писать.

Дейв

вообще-то git branch решает. И потом, для показать, git clone из ветки в подпапку на удаленном сервере. Один пуш и один пулл (кстати можно автоматизировать пулл по событию пуша), один президент, одна Россия!!!!1111

Дмитрий До́рошев

вообще-то git branch решает

Вообще да, но одно другому не мешает: можно ответвиться на вторую версию и сделать в этой ветке ровно то же, о чем я написал в посте.

git clone из ветки в подпапку на удаленном сервере

А если я хочу у себя локально то же самое? Постоянно пушить/пуллить через удалённый хаб в рядом лежащие папки?

Один пуш и один пулл

Да, если внес изменения только в одной ветке.

кстати можно автоматизировать пулл по событию пуша

Можно, если хаб не на гитхабе или битбукете.

Дейв

Не мешает, но зачем?
Хочешь на локальном, но зачем?
Так смысл в том чтобы сделать все локально и по минимуму пушить вторую версию, ниет? Пушить и пуллить можно все сразу.
Гитхуб и битбукит для девочек.

Дмитрий До́рошев

Не мешает, но зачем?

Так быстрее.

Хочешь на локальном, но зачем?

Чтобы не монтировать диск по SSH и чтобы на удалённом не было видно черновых правок.

Так смысл в том чтобы сделать все локально и по минимуму пушить вторую версию, ниет?

Смысл в том, чтобы сделать вёрстку в нескольких версиях, чтобы прям с фронта можно было переключиться: «первая версия», «вторая версия», «третья версия» и так далее.

Гитхуб и битбукит для девочек.

Почему?

Дейв

Я устал. Ты молодец, задачу решил. Но мне кажется что ее не нужно было решать. Ну это мая мнения, я попытался написать что бы я сделал.

Популярное