{"id":756,"date":"2022-05-05T16:36:15","date_gmt":"2022-05-05T14:36:15","guid":{"rendered":"https:\/\/olkn.myvnc.com\/?p=756"},"modified":"2023-09-07T13:34:25","modified_gmt":"2023-09-07T11:34:25","slug":"development-environment","status":"publish","type":"post","link":"https:\/\/olkn.myvnc.com\/?p=756","title":{"rendered":"development environment"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#summary\" >summary<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#git\" >git<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#config\" >config<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#initialise_git_repo\" >initialise git repo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#stage\" >stage<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#commit\" >commit<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#password_less_login\" >password less login<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#initialise_git_repo-2\" >initialise git repo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#add_files_to_repo\" >add files to repo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#add_remote_repo\" >add remote repo<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#docker\" >docker<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#python\" >python<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#docker_composer_file\" >docker composer file<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#docker-file\" >docker-file<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#laravel\" >laravel<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#laravel_with_sail\" >laravel with sail<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#initialize_a_new_project\" >initialize a new project<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#configuration\" >configuration<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#edit_env\" >edit .env<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#docker_composer_file-2\" >docker composer file<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#docker-file-2\" >docker-file<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#programming\" >programming<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#python-2\" >python<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#laravel-2\" >laravel<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#alternative\" >alternative<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#python-3\" >python<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#git-2\" >git<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#README\" >README<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#git_commit\" >git commit<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#skeleton\" >skeleton<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#file_structure\" >file structure<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#program_skeleton\" >program skeleton<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/olkn.myvnc.com\/?p=756\/#requirements\" >requirements<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"summary\"><\/span>summary <span class=\"ez-toc-section-end\"><\/span><\/h1>\n<ul>\n<li>create folder on server as: repo-<target>-dev.git<\/li>\n<li>initialize git repo: git init &#8211;bare<\/li>\n<li>create folder on local machine<\/li>\n<li>get files from remote repo: git clone ssh:\/\/git@olkn.myvnc.com\/repo-<target>-dev.git<\/li>\n<li>add files to staging: git add -A<\/li>\n<li>commit changes to repo: git commit -m &#8220;<comment>&#8220;<\/li>\n<li>push changes to remote repo: git push origin<\/li>\n<\/ul>\n<h1><span class=\"ez-toc-section\" id=\"git\"><\/span>git<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h2><span class=\"ez-toc-section\" id=\"config\"><\/span> config <span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>git config &#8211;global user.name &#8220;olkn&#8221;<\/li>\n<li>git config &#8211;global user.email &#8220;olkn@gmail.com&#8221;<\/li>\n<li>git remote add olkn ssh:\/\/olkn.myvnc.com\/git\/repo-python-development<\/li>\n<li>git config &#8211;global pull.rebase true<\/li>\n<li>git config &#8211;global color.ui auto<\/li>\n<li>git config &#8211;global core.editor vim<\/li>\n<li>.gitignore to list all files that should not be included in git repo<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"initialise_git_repo\"><\/span> initialise git repo <span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>git init <\/p>\n<p>git init &#8211;bare : if the repo is on a server and no working tree is necessary (should end in .git)<\/p>\n<h2><span class=\"ez-toc-section\" id=\"stage\"><\/span> stage <span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Staging adds file to a stage prepared for later commit<\/p>\n<ul>\n<li>git add -A<\/li>\n<li>git stage .<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"commit\"><\/span> commit <span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>All files in staging were added\/committed to the repo<\/p>\n<p>git commit -m &#8220;Comment for commit&#8221;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"password_less_login\"><\/span>password less login<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>ssh-keygen -t rsa -b 4096 -C &#8220;<comment>&#8221;<\/p>\n<p>ssh-add .ssh\/id-rsa<\/p>\n<p>ssh-copy-id -i .ssh\/id-rsa <user>@<server><\/p>\n<h3><span class=\"ez-toc-section\" id=\"initialise_git_repo-2\"><\/span>initialise git repo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>mkdir <folder><\/p>\n<p>cd <folder><\/p>\n<p>git init &#8211;bare &#8211;shared<\/p>\n<h3><span class=\"ez-toc-section\" id=\"add_files_to_repo\"><\/span>add files to repo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>git add -A<\/p>\n<p>git commit -m &#8220;<comment for commit>&#8221;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"add_remote_repo\"><\/span>add remote repo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>git remote add live ssh:\/\/<user>@<server>\/<folder><\/p>\n<p>git push live<\/p>\n<h1><span class=\"ez-toc-section\" id=\"docker\"><\/span>docker<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>docker build -t <image> : build the given image based on Dockerfile<\/p>\n<p>docker images : list all available docker images in the system<\/p>\n<p>docker run -it <image> : run interactive mode image <\/p>\n<p>docker run -d -p 5000:5000 <image> : run image in daemon mode with ports exposed<\/p>\n<p>docker ps : show all running docker container<\/p>\n<p>docker start\/stop <container, id> : start\/stop a container<\/p>\n<p>docker-compose up -d : start docker environment detached<\/p>\n<p>docker-composer down : stop all containers<\/p>\n<p>docker-composer ps : list all running containers<\/p>\n<p>docker-composer build : build images from scratch<\/p>\n<p>docke-compose logs <container> : show the log files for a container<\/p>\n<h3><span class=\"ez-toc-section\" id=\"python\"><\/span>python <span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>project folder<br \/>\n&#8212; docker-compose.yml<br \/>\n&#8211;|&#8211; app (program sources we are working on)<br \/>\n&#8212;-|&#8211; Dockerfile<br \/>\n&#8212;-|&#8211; requirements.txt<br \/>\n&#8212;-|&#8211; src<br \/>\n&#8212;&#8212;-|&#8211; python.py<br \/>\n&#8211;|&#8211; db (data base server and config, if any)<br \/>\n&#8212;&#8211;|&#8211; password.txt<br \/>\n&#8211;|&#8211; web (web server and config, if any)<\/p>\n<h4><span class=\"ez-toc-section\" id=\"docker_composer_file\"><\/span>docker composer file<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><code><br \/>\nersion: \"3.7\"<br \/>\nservices:<br \/>\n  db:<br \/>\n    image: mysql:8.0.19<br \/>\n    command: '--default-authentication-plugin=mysql_native_password'<br \/>\n    restart: always<br \/>\n    secrets:<br \/>\n      - db-password<br \/>\n    volumes:<br \/>\n      - db-data:\/var\/lib\/mysql<br \/>\n    networks:<br \/>\n      - backend-network<br \/>\n    environment:<br \/>\n      - MYSQL_DATABASE=example<br \/>\n      - MYSQL_ROOT_PASSWORD_FILE=\/run\/secrets\/db-password<\/p>\n<p>  app:<br \/>\n    build: app<br \/>\n    restart: always<br \/>\n    secrets:<br \/>\n      - db-password<br \/>\n    networks:<br \/>\n      - backend-network<br \/>\n      - frontend-network<br \/>\n   volumes:<br \/>\n      - .\/app\/src:\/code<br \/>\n    ports: (debugger ports for flask inside the container)<br \/>\n      - 5678:5678<\/p>\n<p>  web:<br \/>\n    build: web<br \/>\n    restart: always<br \/>\n    ports:<br \/>\n      - 80:80<br \/>\n    networks:<br \/>\n      - frontend-network<br \/>\nvolumes:<br \/>\n  db-data:<br \/>\nsecrets:<br \/>\n  db-password:<br \/>\n    file: db\/password.txt<br \/>\nnetworks:<br \/>\n  backend-network:<br \/>\n  frontend-network:<br \/>\n<\/code><\/p>\n<h4><span class=\"ez-toc-section\" id=\"docker-file\"><\/span>docker-file<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><code><br \/>\n# set base image (host OS)<br \/>\nFROM python:3.8<\/p>\n<p># set the working directory in the container<br \/>\nWORKDIR \/code<\/p>\n<p># copy the dependencies file to the working directory<br \/>\nCOPY requirements.txt .<\/p>\n<p># install dependencies<br \/>\nRUN pip install -r requirements.txt<\/p>\n<p># copy the content of the local src directory to the working directory<br \/>\nCOPY src\/ .<\/p>\n<p># command to run on container start<br \/>\nCMD [ \"python\", \".\/server.py\" ]<br \/>\n<\/code><\/p>\n<h1><span class=\"ez-toc-section\" id=\"laravel\"><\/span>laravel <span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h2><span class=\"ez-toc-section\" id=\"laravel_with_sail\"><\/span>laravel with sail<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>install docker compose<\/li>\n<li>install composer: wget https:\/\/getcomposer.org\/installer <\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"initialize_a_new_project\"><\/span>initialize a new project<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><code>curl -s https:\/\/laravel.build\/project-name?with=mysql,selenium,mailhog |bash <\/code><\/p>\n<h2><span class=\"ez-toc-section\" id=\"configuration\"><\/span>configuration<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"edit_env\"><\/span>edit .env<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"docker_composer_file-2\"><\/span>docker composer file<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>docker-compose.yml<\/p>\n<h4><span class=\"ez-toc-section\" id=\"docker-file-2\"><\/span>docker-file<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h1><span class=\"ez-toc-section\" id=\"programming\"><\/span>programming<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h3><span class=\"ez-toc-section\" id=\"python-2\"><\/span>python<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h3><span class=\"ez-toc-section\" id=\"laravel-2\"><\/span>laravel<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h1><span class=\"ez-toc-section\" id=\"alternative\"><\/span>alternative <span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h3><span class=\"ez-toc-section\" id=\"python-3\"><\/span>python<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>python3 -m venv <project name><\/li>\n<li>source <project name>\/bin\/activate<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"git-2\"><\/span>git<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>git init . (executed in <project name> folder of course<\/li>\n<li>create .gitignore with contents (*.pyc and __pycache__)<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"README\"><\/span>README<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>create a file README with project description and usage instructions<\/p>\n<p>markdown format (README.md) would be a good choice for the formatting<\/p>\n<h3><span class=\"ez-toc-section\" id=\"git_commit\"><\/span>git commit<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>git add .gitignore README.md<\/li>\n<li>git add *<\/li>\n<li>git comit -m &#8220;initial release&#8221;<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"skeleton\"><\/span>skeleton<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"file_structure\"><\/span>file structure<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>folder docs &#8211; program documentation (spinx)<\/li>\n<li>folder src\/app &#8211; source code of the application<\/li>\n<li>folder tests &#8211; unit test files<\/li>\n<li>.gitignore &#8211; see above<\/li>\n<li>requirements.txt &#8211; pip requirements file<\/li>\n<li>README.md &#8211; see above<\/li>\n<li>TODO.md &#8211; open issues to implement<\/li>\n<li>LICENSE &#8211; ???<\/li>\n<li>setup.py &#8211; see below<\/li>\n<\/ul>\n<h4><span class=\"ez-toc-section\" id=\"program_skeleton\"><\/span>program skeleton<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>structure with functions, classes, modules, etc but with docstrings only as the contents will follow later with the implementation<\/p>\n<p>create the main file, e.g. <project name>.py<\/p>\n<p><code><br \/>\n\"\"\" descriptive text\"\"\"<br \/>\nimport sys<\/p>\n<p>\"\"\"definition of constants\"\"\"<br \/>\nURL = \"https:\/\/olkn.myvnc.com\"<\/p>\n<p>def main():<br \/>\n    \"\"\" main entry point for the program \"\"\"<br \/>\n    pass<\/p>\n<p>\"\"\"definition of functions\"\"\"<br \/>\ndef get_url(url):<br \/>\n   \"\"\"describe function\"\"\"<br \/>\n   pass<\/p>\n<p>if __name__ == '__main__'<br \/>\n    sys.exit(main())<br \/>\n<\/code><\/p>\n<h3><span class=\"ez-toc-section\" id=\"requirements\"><\/span>requirements<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>list all the requirements in a file: <code>pip freeze requirements.txt<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>summary create folder on server as: repo&#8211;dev.git initialize git repo: git init &#8211;bare create folder on local machine get files from remote repo: git clone ssh:\/\/git@olkn.myvnc.com\/repo&#8211;dev.git add files to staging: git add -A commit changes to repo: git commit -m &#8220;&#8220; push changes to remote repo: git push origin git config git config &#8211;global user.name &hellip; <a href=\"https:\/\/olkn.myvnc.com\/?p=756\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">development environment<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,10],"tags":[35,46,201,200,202],"class_list":["post-756","post","type-post","status-publish","format-standard","hentry","category-knowledgebase","category-sniplets","tag-administration","tag-config","tag-laravel","tag-programming","tag-python"],"_links":{"self":[{"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/posts\/756","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=756"}],"version-history":[{"count":26,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/posts\/756\/revisions"}],"predecessor-version":[{"id":848,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/posts\/756\/revisions\/848"}],"wp:attachment":[{"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}