jQuery Примитивы

Редакция автор: stain

Подключение библиотеки jQuery.

Производится либо внутри тега head, либо в теле документа, для более быстрой страницы контента, указывается чаще всего перед закрывающим тегом body.

Уменьшение кода на рутинных операциях js.

Заполням контейнер с идентификатором start строкой Go.

JS

var el = document.getElementById("start");
el.innerHTML = "Go";

jQuery
$("#start").html("Go");

Вызов кода на jQuery
$(document).ready(function() { // jQuery code goes here });
Короткая запись $(function() { // jQuery code goes here });

Basic syntax is: $("selector").action()
- The $ accesses jQuery.
- The (selector) finds HTML elements.
- The action() is then performed on the element(s).
$("p").hide() // hides all paragraf elements
jquery-selectorsDom

Метод attr() - Управление содержимым атрибута
We can manipulate attributes assigned to HTML elements easily through jQuery.
href, src, id, class, style are all examples of HTML attributes.
$(function() {var val = $("a").attr("href"); alert(val); }); // покажет путь ссылки в виде alert
Подмена контента выбранного атрибута.
$(function() {$("a").attr("href", "http://www.jquery.com"); });
Метод removeAttr() - Удаление выбранного атрибута из разметки страницы
$("table").removeAttr("border"); // В данном случае мы убираем у тега таблицы, атрибут границы.
The html() and text() methods can be used for all HTML elements that can contain content.
Метод html() - обращаясь к контенту выбранного объекта захватит как контент так и внутренние таги разметки.
$("p").html(); //
Метод text() - обращаясь к контенту выбранного объекта захватит только текст.
$("p").text();
Замена контента
$(function() {$("#test").text("hello!"); });
Метод val() обращается к полям форм
$(function() {alert($("#name").val());}); //alerts "Your Name"

Методы добавление контента к уже существующему без его удаления.
jQuery has methods that are used to add new content to a selected element without deleting the existing content:
После и до содержимого элемента.
append() inserts content at the end of the selected elements.
prepend() inserts content at the beginning of the selected elements.
После и до тага с элементом.
after() inserts content after the selected elements.
before() inserts content before the selected elements.

Сначала присваиваем переменной код вторженца, а затем добавляем его в виде переменной следом за тегом содержащим идентификатор demo

$(function() {var txt = $('').text("Hi");  $("#demo").after(txt);  });

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

Манипуляции с CSS
addClass( ) - Позволяет задать класс тегу или несколько классов через пробел.
$("div").addClass("header");
removeClass() - Удаление классов.
toggleClass() - Если классы есть то удаляются, если классов нет то добавляются.

Если метод html() добавляет код html
то метод css() добавляет код css, Элементарно Ватсон.
$(function() {alert($("p").css("background-color")); $("p").css("background-color", "blue"); });
Вариант с использованием JSON синтаксиса. $("p").css({"color": "red", "font-size": "200%"});
Методы width() и height() измеряются в пикселях, которые не нужно упоминать просто указывайте числовое значение.
Сумма размеров див блока и его паддингов - innerWidth() and innerHeight() methods also include the padding.
Сумма размеров див блока, паддингов и границ - outerWidth() and outerHeight() methods include the padding and borders.
Пример ниже отобразит данные о всех размерах, внутри див блоков.

$(function() {
    var txt = "";
    txt += "width: " + $("div").width() + " ";
    txt += "height: " + $("div").height() + "
";
    txt += "innerWidth: " + $("div").innerWidth() + " ";
    txt += "innerHeight: " + $("div").innerHeight() + "
";
    txt += "outerWidth: " + $("div").outerWidth() + " ";
    txt += "outerHeight: " + $("div").outerHeight();
    
    $("div").html(txt);
});

Снова ДОМ.
An ancestor is a parent, grandparent, great-grandparent, and so on. родители, и пра прародители ...
A descendant is a child, grandchild, great-grandchild, and so on. Дети, внукиЮ правнуки ...
Siblings share the same parent. Братья и сестры.
jquery-selectorsDom

Удаление элементов remove()
The jQuery remove() method removes the selected element(s), as well as its child elements.
Ну очень странное описание, у меня не удалились дочерние элементы, только элемент который я убирал.
$("p").children.remove(); Удаление дочернего элемента параграфа.

Удаление контента empty()

События
Реакция на клик мышкой, запись в объект с идентификатором demo даты вместо контента.
JS
var x = document.getElementById("demo"); x.onclick = function () {document.body.innerHTML = Date();}
jQuery
$("#demo").click(function() {$("body").html(Date());});

Common Events
The following are the most commonly used events:
Mouse Events
click occurs when an element is clicked.
dblclick occurs when an element is double-clicked.
mouseenter occurs when the mouse pointer is over (enters) the selected element.
mouseleave occurs when the mouse pointer leaves the selected element.
mouseover occurs when the mouse pointer is over the selected element.

Keyboard Events
keydown occurs when a keyboard key is pressed down.
keyup occurs when a keyboard key is released.

Form Events:
submit occurs when a form is submitted.
change occurs when the value of an element has been changed.
focus occurs when an element gets focus.
blur occurs when an element loses focus.

Document Events:
ready occurs when the DOM has been loaded.
resize occurs when the browser window changes size.
scroll occurs when the user scrolls in the specified element.

on() используется для назначения следствий на события, можно назначать сразу несколько событий(через пробел) имеющих одно следствие.
$(function() {$( "p" ).on( "click mouseleave", function() {alert("clicked"); }); });
В этом примере при нажатии или убирании курсора происходит одно и тоже действие.

off() Позволяет отключать событие например по условию, иначе какой смысл.
$(function() {$("div").on("click", function() {alert('Hi there!'); }); $("div").off("click"); });

Every event handling function can receive an event object, which contains properties and methods related to the event:
pageX, pageY the mouse position (X & Y coordinates) at the time the event occurred, relative to the top left of the page.
type the type of the event (e.g. "click"). Вывод типа события
which the button or key that was pressed. Номер сработавшей кнопки
data any data that was passed in when the event was bound. Отображает данные.
target the DOM element that initiated the event.
preventDefault() prevent the default action of the event (e.g., following a link).
stopPropagation() Stop the event from bubbling up to other elements.
$(function() { $( "a" ).click(function(event) {alert(event.pageX); event.preventDefault(); }); });
При нажатии на ссылку выводится алерт с текущими координатами оси Х.

trigger() - Засекает событие, вне зависимости где конкретно оно происходит.
The trigger() method cannot be used to mimic native browser events, such as clicking on a file input box or an anchor tag. Only events in the jQuery event system can be handled.

Создаем список дел.
HTML для наглядности

My To-Do List
        

My To-Do List

    Событие

    $(function() {
      $("#add").on("click", function() {
        //event handler
      });
    });
    По событию запускается обработчик событий
    
    Обработчик события добавления нового пункта.
    
    var val = $("input").val();
    if(val !== '') {
      var elem = $("
  1. ").text(val); $(elem).append(""); $("#mylist").append(elem); $("input").val(""); //clear the input }

    Содержимое поля ввода присваивается переменной
    переменная проверяется на имеющиеся там значения
    за элементом поля создается кнопка X
    в пустой список добавляется подготовленный элемент списка
    а в него добавляется содержимое поля.

    Подключаем обработчик для удаления элемента.

    $(".rem").on("click", function() {
      $(this).parent().remove();
    });

    И теперь весь код

    $(function() {
      $("#add").on("click", function() {
        var val = $("input").val();
        if(val !== '') {
         var elem = $("
  2. ").text(val); $(elem).append(""); $("#mylist").append(elem); $("input").val(""); $(".rem").on("click", function() { $(this).parent().remove(); }); } }); });

    Remember, this is the current object.

    The hide() and show() methods are used to hide and show the selected elements.
    The toggle() method is used to toggle between hiding and showing elements.
    The hide/show/toggle methods can take an optional argument, speed, which specifies the animation speed in milliseconds.
    $(function() {$("p").click(function() {$("div").toggle(1000); }); });
    The hide/show/toggle methods can also take a second optional parameter callback, which is a function to be executed after the animation completes.

    Similar to the hide/show methods, jQuery provides the fadeIn/fadeOut methods, which fade an element in and out of visibility.
    the fadeToggle() method fades in and out. fadeToggle() takes two optional parameters: speed and callback.
    Another method used for fading is fadeTo(), which allows fading to a given opacity (value between 0 and 1). For example: $("div").fadeTo(1500, 0.7);

    The slideUp() and slideDown() methods are used to create a sliding effect on elements. The slideToggle() method switches between the sliding effects and can take two optional parameters: speed and callback.

    The .animate() method lets you animate to a set value, or to a value relative to the current value.
    You need to define the CSS properties to be animated as its parameter in JSON format ("key":"value" pairs).
    $("div").click(function() {$("div").animate({width: '250px'}, 1000); });

    Анимация происходит последовательно.
    You can animate any CSS property using the above mentioned syntax, but there is one important thing to remember: all property names must be camel-cased when used with the animate() method (camelCase is the practice of writing compound words or phrases such that each word or abbreviation begins with a capital letter with the first word in lowercase).
    You will need to write paddingLeft instead of padding-left, marginRight instead of margin-right, and so on.
    It is also possible to define relative values (the value is then relative to the element's current value). This is done by putting += or -= in front of the value:
    $("div").animate({width: '+=250px', height: '+=250px'}, 1000);
    To stop an animation before it is finished, jQuery provides the stop() method.

    Комментариев: 0

    jQuery это зло «Шаги в пучину зла»

    Редакция автор: stain

    Скрипты внедряются до их вызова. И если в браузере отключены, то не исполняются. Надо подгружать обработчик jQuery. 

    Структура скрипта, функции jQuery.

    Внешний контур
    <script></script>

    Внутренний контур
    $(document).ready(function() {

    });

    Сам скрипт например создающий анимацию подпрыгивания всех кнопок
    $("button").addClass("animated bounce");

    Здесь button это объект(другие объекты указываются как в стилях css), для которого создается класс анимации(и указано какой конкретно).Кроме прочего там же в скрипте можно прописывать и другие известные классы например из Bootstrap.

    Одному объекту может быть назначено много классов, как в одной функции так и для каждого класса отдельно.

    например:
    $("button").addClass("animated");
    $("button").addClass("bounce");

    Кроме добавления классов, можно их и отключать
    $("button").removeClass(".btn-default");

    Для изменения каких либо параметров css используется .css("name","value")
    Например сменим цвет для идентификатора target1 голубой:
    $("#target1").css("color", "blue");

    Для изменения функций html элементов используется функция .prop("параметр", boolean)
    Следующий пример делает все кнопки неактивными устанавливая параметр "disabled" в состояние истины:
    $("button").prop("disabled", true);

    Функция .html() позволяет заменять контент для указанного элемента, в примере ниже в заголовке замещается текст, и добавляются прочие элементы форматирования. Аналогичная ей функция .text() позволяет замещать текст, без внедрения элементов форматирования.
    $("h3").html("<em>jQuery Playground</em>");

    Функция .remove() позволяет удалять отображение html объектов. Ниже приведен пример удаления с экрана элемента которому присвоен идентификатор target4.
    $("#target4").remove();

    Функция .appendTo() позволяет перенести объект и прикрепить его в другом месте. Ниже показано как элемент с идентификатором target4 вставляется в конец объекта с идентификатором left-well.
    $("#target4").appendTo("#left-well");

    Функция .clone() позволяет клонировать объект с последующей привязкой через функцию .appendTo. Когда используется несколько функций подряд это называется Цепью функций(ну примерно).
    В примере ниже клон элемента target5 встраивается в конец контейнера left-well.
    $("#target5").clone().appendTo("#left-well");

    Функция .parent() позволяет задавать параметры объекту в который вложен наш объект. В примере ниже, я через элемент target1 задаю красный фон его родителю.
    $("#target1").parent().css("background-color", "red");

    Детей не трогать!

    Функция .children() позволяет задавать параметры для потомков. В примере через элемент right-well я обратился к его детям и он покрасил их оранжевым цветом.

    $("#right-well").children().css("color", "orange");

    Блин вот это не понял.

    jQuery uses CSS Selectors to target elements. target:nth-child(n) css selector allows you to select all the nth elements with the target class or element type.

    Вроде как это обращение к похожим элементам посредством номера по порядку их появления, но у меня две колонки и оба элемента прыгают. то есть функция анимации прыжка заставляет все элементы на одной горизонтали подпрыгивать.

    $(".target:nth-child(2)").addClass("animated bounce");

    Аналогичные указатели :even - каждый, :odd,

    Here's how you would target all the odd-numbered elements with class target and give them classes:

    $(".target:odd").addClass("animated shake");

    Note that jQuery is zero-indexed, meaning that, counter-intuitively, :odd selects the second element, fourth element, and so on.

    Try selecting all the even-numbered elements and giving them the classes ofanimated and shake.

    $(".target:even").addClass("animated shake");

    Это просто  еще один элемент анимации hinge, демонстрирует как наш сайт свешивается на левом углу а затем падает. в никуда

    $("body").addClass("animated hinge");

    Элемент анимации fadeOut прячет элемент.

    Для дальнейшего изучения, предлагаю ознакомиться jQuery API.
    jQuery API

    Комментариев: 0

    PhantomJS Примитивы

    Редакция автор: stain

    Немного вводного нытья.

    Итак после тыканья палками в NodeJS, смотришь примеры PhantomJS, и да теряешься, откуда там библиотеки подгружаются? Анализируя код думаешь что все это построено на том же Node, но НЕТ! Эти модули, они вероятно уже встроены в Phantom, либо что врядли подгружаются из jQuery скажете абсурд, и я пожалуй соглашусь. Но изначально ясности нет.

    Так вот эти модули которые require уже встроены, все что надо это натравить Phantom на скрипт.js который что то там парсит, и получить результат. Безусловно можно подключать какие то сторонние инструменты для последующей обработки, например тот же jQuery.

    Простой парсинг.

     
    var fs = require('fs');
    var page = require('webpage').create();
    var url = 'http://www.pixarts.ru';
    
    // Открываем страницу 
    page.open(url, function (status) { if (status === 'success') { console.log('Page is loaded');
    
    // Подключаем 
    jQuery page.injectJs('jquery.min.js');
    
    // Получаем нужный контент 
    html = page.evaluate(function() { 
        /* пример не мой, нет на сайте который я типа парсил нужного класса тайтла 
        titles = ''; 
        $('.post_title').each(function(){ titles += $(this).html() + '\n'; }); 
        return titles;
        */ 
        return $('html').html(); });
    
        // Пишем в файл
        var file = fs.open('articles.txt', "w+");
        //если файл уже существует то будет дописано в конец, поэтому возможно стоит его удалять перед открытием.
        file.write(html + '\n');
        file.close();
        phantom.exit();
      }
    });
    

    Установка таймаутов.

    html = window.setTimeout((function() {
      //Какой то запрос
    }), 2000);
    

    Ротация Юзерагентов.

    // Список user-agent
    var useragent = [];  
    useragent.push('Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14');  
    useragent.push('Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50');  
    useragent.push('Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25');  
    useragent.push('Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02');  
    useragent.push('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0');
    
    page.settings.userAgent = useragent[Math.floor(Math.random() * useragent.length)];  
    

    2014 PhantomJS + CasperJS

    Комментариев: 0

    Гит-циклы и работа с хостингом Timeweb

    Редакция автор: stain

    Git поддержка: GitHub, SourceForge, BitBucket и Google Code.

    Начало:

    Эта команда создаёт в текущем каталоге новый подкаталог с именем .git содержащий все необходимые файлы репозитория — основу Git-репозитория. На этом этапе ваш проект ещё не находится под версионным контролем.

    git init

    Git Цикл №1: Индексируем, Подтверждаем, Заливаем.

    Индексация - Добавляем новые и измененные данные. Если вы выполнили индексацию, то автоматически согласились с внесением изменений.

    git add filename

    , или для всех файлов каталога git add .

    Делаем новый коммит(снапшот).

    git commit -m "комментарий"

    Да если добавить параметр -a, то предыдущую команду выполнять не нужно. Дополнительно для проверки состояния репозитария команда git status и более подробная git diff

    Или все тоже но в одну строку

    git init && git add -A && git commit -m "Initial commit"

    Заливка на github.

    Предварительно нужно создать на ресурсе github пустой репозиторий.
    для справки origin - это название удаленного репозитория, на локальной машине.

    git remote add origin git@github.com:loginname/objectname.git
    git push -u origin master

    Клонируем чужой репозиторий с того же github по ssh.

    Создаем или выбираем каталог где будет храниться клон репозитория. В git заходим в выбранную папку.
    На github находим нужный нам репозиторий, например jquery, выбираем тип подключения SSH(требуются ключи), забираем ссылку, перед ней вставляем git clone.

    git clone git@github.com:jquery/jquery.git

    Не Цикл: Заливка на хостинг timeweb.ru.

    (утомился ломиться, но ура!).

    На хостинге:

    через ssh заходим в папку нашего сайта public_html
    Инициализация репозитория на сервере, а затем так как мы работаем не с голым (bare) репозиторием, обязательно разрешим перезапись текущей ветки:

    git init
    git config receive.denyCurrentBranch ignore
    

    естественно нужно все это делать в public_html или на уровень ниже, но надо понимать что распаковка изменений будет аналогично локальному репозитарию.
    Хук который делает всю работу

    touch .git/hooks/post-receive
    cat << EOF > .git/hooks/post-receive
    #!/bin/sh
    cd ..
    GIT_DIR='.git'
    git reset --hard
    EOF
    chmod +x .git/hooks/post-receive

    теперь строка на клиентской машине, которая отвечает за правильный коннект к вашему удаленному репозиторию

    git remote add --track master origin ssh://логин@сервер/~/каталогсайта/public_html/.git

    Загрузка на целевой сервер основной ветки.

    git push --set-upstream origin master

    дальше ориентируйтесь на эту статью

    Или складываем хуки.

    Для выгрузки использовать

    git add имяфайла
    git commit -m "Ещё один коммит"
    git push
    

    Для конкуретного обновления файлов через SSH/FTP нужен еще один хук

    touch .git/hooks/pre-receive
    cat << EOF > .git/hooks/pre-receive
    #!/bin/sh
    cd ..
    GIT_DIR='.git'
    git stash save --quiet
    git stash show || true
    EOF
    chmod +x .git/hooks/pre-receive

    , но и поправить хук для выгрузки через ssh.

    touch .git/hooks/post-receive
    cat << EOF > .git/hooks/post-receive
    #!/bin/sh
    cd ..
    GIT_DIR='.git'
    git reset --hard
    git stash pop --quiet || git reset --hard
    EOF
    chmod +x .git/hooks/post-receive
    

    В этой усложнённой схеме, в случае конфликтов при git push, вам нужно будет вручную сделать git stash pop на сервере и разрешить конфликты.

    ЗЫ:

    1. Важно, если ниже, ниже .... уровнем существует каталог .git, то git это видит.

    2. если у вас не получилось корректно подключиться, можно удалить созданный вами удаленный репозиторий командой:

    git remote remove origin

    , в данном примере удаленный репозиторий назван origin

    Безусловно еще нужно сделать ключи RSA, залить публичные на сервер. а на клиентской машине прописать конфиг, где будет указано для какого ресурса какие ключи.

    Git Цикл №2: Создание и переход в новую ветку.

    git checkout -b название ветки

    Вернуться к ветке master

    git checkout master

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

    После решения задачи следует сделать слияние с основной веткой(без полного понимания не исполнять).

    git merge названиеветки

    После слияния с основной веткой и если задача для которой была создана ветка решена, следует удалить ветку в которой вы решали задачу.

    git branch -d название ветки

    Также если у вас несколько веток, и допустим нужно дополнить одну из второстепенных веток изменениями в ветке master, выполните

    git merge master

    Источник: Основы-ветвления-и-слияния

     

    Git Цикл №3: Возврат к более раннему коммиту.

    (состоянию, снапшоту).

    Просмотр всех существующих коммитов

    git log

    но добавив параметры -p -2 , мы зададим первым показ изменений, а вторым глубину погружения на 2 ниже.

    Теперь само удаление(откат)
    Выбираем нужную ветку

    git checkout названиеветки

    делаем откат изменений в репозитории, для примера на два коммита назад

    git reset --hard HEAD~2

    Можно сделать до какого то определенного коммита по хешу

    git reset --hard HEAD hash

    Хеш можно взять в вебинтерфейсе гитхаба.

    Далее делаем принудительный коммит в основной репо на удаленном сервере

    git push -f origin названиеветки

    без -f будет ругаться что у вас версия младше чем на сервере и типа вам надо сделать pull.

    Источники: Как откатить коммиты, Git Wizardry.

    Забыли произвести индексацию нестрашно, проведите ее после коммита, а затем выполните команду обновления коммита (она также позволяет отредактировать комментарий). Ниже показан весь цикл.

    git commit -m 'initial commit'
    git add forgotten_file
    git commit --amend

    Также можно отменить индексацию, если вы еще не провели операцию коммит

    git reset HEAD имя файла

    какие именно файлы попали в индексацию вы можете узнать с помощью команды git status.

    Также можно отменить изменения файла, но нужно понимать что они исчезнут затрутся старым файлом из предыдущего коммита.

    git checkout --имяфайла

    Как забрать себе репозиторий с Timeweb

    Все делается на локальной машине, выбирается папка приемник
    в ней открывается консоль GIT

    git init
    git remote add --track master origin ssh://accountname@IP_server/~/project_folder/public_html/.git
    # git fetch - -all #Это лишнее, это для копии текущего состояния без развертывания, чтобы можно было позже сделать слияние.
    git pull
    
    # Последующие разработчики, но тут загвоздка пользователь хостинга все же один.
    git clone ssh://accountname@IP_server/~/project_folder/public_html/.git
    # Проверил работает, но создает каталог public_html, что ломает работу с openserver, но простое перекидывание содержимого на уровень ниже решает проблему.
    

    А если кто то менял файлы ручками на сервере, в истории git это не отобразится, чтобы сделать актуальным состояние в скачиваемых с сервера файлах посредством git, нужно зайти через консоль putty/ssh/или через админку и если полностью то

    git add . && git commit -m "commit subject about change"
    

    и уже после этого git pull на клиенте.

    P.S.: Естественно у вас должна быть в домашней папке компьютера папка ~/.ssh, с ключем rsa, с конфигом в файле ~/.ssh/config.

    Host IP_adress
    HostName servername.timeweb.ru
    User accountnametimeweb
    IdentityFile /C/Users/localusername/.ssh/filenamekey
    

    А на сервере в корне выданной хостером домашней папке, тоже каталог .ssh с публичным ключом вписанным в файл ~/.ssh/authorized_keys

    Трабл слияния, если копошиться в одних и тех же файлах, и делать комиты не последовательно, то в итоге будут неразрешимые автоматически конфликты. Как вариант можно откатиться назад на несколько шагов, и забрать с сервера свежие файлы, или разгребать изменения и мерджить в ручную как пока не скажу. 😊 Пока что совет не работать в команде над одними и теми же файлами.

    !!!После git pull требуется нажать клавишу insert вписать коммент к смерджованному комиту, затем esc, затем :w, что сохранит смерджованые данные, и по сути создаст следующий по счету коммит, после чего можно будет запушить свежий коммит обратно на сервер.

    Как поступать с конфликтами при слиянии, и получается что если один файл в разных коммитах имеет разные дополнения, то сливать придется редактированием этого файла до состояния включающего все что вам в нем нужно, и последующей индексацией.
    git add . или git add имяфайла
    и затем git commit.

    Скрипт инициализации git цикла на сервере, исключительно для shared хостинга Timeweb поскольку у него домашние каталоги хостящегося клиента выглядят так /home/u/username.

    #!/bin/bash
    #bash gitps.sh site user
    if [ -z $1 ] ; then
    echo «Do not set your domain name.»
    exit 1 ; fi
    if [ -z $2 ] ; then
    username='im'
    echo «Do not set your user name. Default name is ${username}» ; fi
    if [ ! -d ~/$1/ ]; then
    echo '«Site directory noexist! Script stoped.»'
    exit 1; fi
    if [ -d ~/$1/.git/ ]; then
    echo '«Git directory exist, script stoped.»'
    exit 1; fi
    
    #git prepare
    #subdomain.timeweb.ru
    ipsrv='192.168.0.1'
    sitename=$1
    # $u is first character in username
    u=$(echo $username | sed 's/^\(.\).*/\1/')
    
    cd /home/$u/$username/$sitename
    
    git init
    git config receive.denyCurrentBranch ignore
    
    touch .git/hooks/post-receive
    cat < .git/hooks/post-receive
    #!/bin/sh
    cd ..
    GIT_DIR='.git'
    git reset --hard
    EOF
    chmod +x .git/hooks/post-receive
    
    cd /home/$u/$username
    
    echo ""
    echo "«First webdev»"
    echo '  «git init»'
    echo '  «git add . && git commit -m "commit subject about change"»'
    echo "  «git remote add --track master origin ssh://${username}@${ipsrv}/~/${sitename}/.git»"
    echo '  «git push»'
    echo ''
    echo '«Other webdev»'
    echo "  «git clone ssh://${username}@${ipsrv}/~/${sitename}/.git»"
    
    

    Комментариев: 0