<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های &lt; فرهاد اشتری /&gt;</title>
        <link>https://virgool.io/feed/@farhad.ashtari</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-07 09:10:56</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/24102/avatar/sllb9p.jpg?height=120&amp;width=120</url>
            <title>&lt; فرهاد اشتری /&gt;</title>
            <link>https://virgool.io/@farhad.ashtari</link>
        </image>

                    <item>
                <title>چگونه postgresql و pgadmin را بر روی اوبونتو نصب کنیم؟</title>
                <link>https://virgool.io/@farhad.ashtari/%DA%86%DA%AF%D9%88%D9%86%D9%87-postgresql-%D9%88-pgadmin-%D8%B1%D8%A7-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%A7%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-%D9%86%D8%B5%D8%A8-%DA%A9%D9%86%DB%8C%D9%85-fbcwifljqack</link>
                <description>قبل از هرچیز بهتر است بدانیم که سیستم های مدیریت پایگاه داده رابطه‌ای، بخش کلیدی  و مهم بسیاری از وب سایت هاست. این سیستم ها امکاناتی را جهت خواندن، نوشتن و سازمان دهی داده هادر اختیار برنامه نویسان قرار می‌دهند.پستگرس اس کیو ال یک سیستم مدیریت پایگاه داده رابطه ای است که می‌تواند گزینه مناسبی برای پروژه‌های برنامه نویسی کوچک و بزرگ باشد. در این مقاله قصد داریم به شما آموزش دهیم که چگونه postgresql و محیط گرافیکی مدیریت آن یعنی pgadmin را بر روی یک ماشین با سیستم عامل اوبونتو نصب کنید.نکته مهم: در این آموزش از سیستم عامل اوبونتو نسخه ۲۰.۰۴استفاده شده است.مراحل نصب سیستم مدیریت پایگاه داده رابطه ایبرای نصب پستگرس مراحل زیر را در نهایت دقت انجام دهید.مرحله اول: نصب پستگرسدر ابتدا شما باید لیست مخازن سیستم عاملتان را با  دستور زیر به روز رسانی کنیدsudo apt update وپسازآنازطریقدستورزیردونرمافزاررانصبکنید sudo apt install postgresql postgresql-contrib sudoaptinstallpostgresqlpostgresql-contrib جهت دسترسی به پایگاه داده پستگرس دستور زیر را وارد کنید تا به اکانت این پایگاه داده سوییچ کنیدسپس در صورتی که می خواهید در محیط خط فرمان با پایگاه داده کار کنید از دستور زیر استفاده کنیدpsqlبرای خروج از خط فرمان پایگاه داده پستگرس و سوییچ کردن به خط فرمان ترمینال می توانید از دستور q\ استفاده کنیددر نهایت می‌توانید از دستورsudo systemctl enable postgresqlاستفاده کنید تا سرویس این پایگاه داده را در استارتاپ سیستم خود قرار داده تا به هنگام راه اندازی سیستم به طور خودکار شروع به کار کند.و جهت ریستارت کردن، متوقف کردن سرویس و شروع به کار سرویس می توانید به ترتیب از دستورهای زیر استفاده کنید.sudo systemctl restart postgresqlsudo systemctl stop postgresqlsudo systemctl start postgresqlمرحله دوم: نصب پیش نیاز های pgadminبرای نصب پیش نیازهای pgadmin از دستور زیر استفاده می کنیم:sudo apt install build-essential libssl-dev libffi-dev libgmp3-dev virtualenv python3-pip libpq-dev python-devامکان دارد که شما در سیستم عامل اوبونتوی خود بخواهید چندین ورژن پایتون را نصب کنید و برای هر ورژن نرم افزارهای مختص به خود را داشته باشید. Virtualenv این قابلیت را برای شما فراهم می سازد، زیرا در حالت عادی امکان نصب نرم افزارهایی با ورژن های مختلف پایتون در یک سیستم عامل وجود ندارد. ـVirtualenv یک محیط مجازی را برای شما فراهم می کند تا بتوانید نصبهر کدام از نرم افزارهای خود را در یک محیط ایزوله شده انجام دهید.نرم افزار python3-pip چیست؟این نرم افزار پکیج منیجری برای نرم افزارهای نوشته شده با پایتون است. این پکیج منیجر pip نام دارد.پس از نصب نرم افزارهای بالا با استفاده از دستور زیر یک دایرکتوری بسازید تا فایل های مربوط به pgadmin درون آن قرار گیرد.mkdir pgadminو سپس وارد این دایرکتوری می شویم:cd pgadminحال درون این داکتوری با استفاده از نرم افزار virtualenv یک محیط مجازی به وجود می آوریم.Virtualenv pgadminاین دستور یک دایرکتوری دیگر با نام pgadmin درون دایرکتوری قبلی ایجاد می کند.سپس وارد دایرکتوری ایجاد شده با virtualenv می شویم:cd pgadminو سپس از دستور source به شکل زیر استفاده می کنیم تا وارد محیط ایزوله شده شویم:source bin/activate حالبادستورزیرفایلنصبیpgadminرادانلودمیکنیم: wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v4.22/pip/pgadmin4-4.22-py3-none-any.whlو سپس با استفاده از پکیج منیجر pip آن را نصب می کنیم:pip install  pgadmin4-4.22-py3-none-any.whlتا اینجای کار pgadmin بر روی سیستم عامل شما نصب شده است و در ادامه باید به پیکربندی آن بپردازیم.مرحله سوم: پیکر بندی pgadminدر مرحله قبل، یک دایرکتوری با نام pgadmin ساختیم و درون آن هم یک دایرکتوری دیگر با همین نام ساختیم که یک محیط ایزوله شده بود. در این مرحله باید در مسیر زیر یک فایل با نام config_local.py ایجاد کنیم.sudo nano /pgadmin/pgadmin/lib/python3.8/site-packages/pgadmin4/config_local.pyپس از ایجاد فایل عبارات زیر را در آن کپی می کنیم:import os
DATA_DIR = os.path.realpath(os.path.expanduser(u&#039;~/.pgAdmin/&#039;))
LOG_FILE = os.path.join(DATA_DIR, &#039;pgAdmin4.log&#039;)
SQLITE_PATH = os.path.join(DATA_DIR, &#039;pgAdmin4.db&#039;)
SESSION_DB_PATH = os.path.join(DATA_DIR, &#039;sessions&#039;)
STORAGE_DIR = os.path.join(DATA_DIR, &#039;storage&#039;)
SERVER_MODE = Falseسپس با استفاده از دستور زیر وارد محیط خط فرمان postgresql می شویم:sudo -u postgres psql postgresسپس با استفاده از دستور زیر برای پستگرس یک رمز عبور تعریف می کنیم.\password postgresحال با استفاده از دستور زیر pgadmin اجرا می کنیم:python /pgadmin/pgadmin/lib/python3.8/site-packages/pgadmin4/pgadmin4.pyحال با ورود به مرورگر و استفاده از آدرس 127.0.0.1:5050 می توانیم به محیط گرافیکی pgadmin دسترسی داشته باشیم.تا اینجای کار روش نصب و پیکر بندی postgresql و pgadmin را بررسی کردیم. اگر سوالی در این زمینه برای شما باقی مانده است، آن را در قسمت نظرات بپرسید تا به آن پاسخ دهیم</description>
                <category>&lt; فرهاد اشتری /&gt;</category>
                <author>&lt; فرهاد اشتری /&gt;</author>
                <pubDate>Thu, 11 Jun 2020 13:24:30 +0430</pubDate>
            </item>
                    <item>
                <title>چگونه با php یک سیستم hookable مانند وردپرس بسازیم؟</title>
                <link>https://virgool.io/@farhad.ashtari/how-to-implement-hookable-system-like-wordpress-m2ci53wgfnpk</link>
                <description>امروز قصد دارم به یکی از ترفندهایی بپردازم که با کمک اون می تونید به راحتی یک سیستم hookable رو در php پیاده سازی کنید. دقیقا مانند اون چیزی که در وردپرس وجود داره. سیستم های hookable سیستم هایی هستند که برنامه نویس می تونه در جاهای مختلف از سورس پروژه hook های مختلف رو رجیستر کنه و هر زمان که نیاز داشت تمام hook ها رو با یک دستور فراخوانی کنه.   اگر نمی دونید یک سیستم hookable چی هست در ابتدا به طور مختصر اون رو با مثال هایی از سیستم مدیریت محتوای وردپرس براتون توضیح میدم. پس با من همراه باشید:  در وردپرس تابعی وجود داره به اسم add_action که نحوه استفاده از اون به صورت زیر هست:  add_action(‘tag_name’ , ‘function_name’);function function_name(){// do something}  و یک تابع دیگه در وردپرس داریم به نام do_action که به صورت زیر استفاده میشه:do_action(‘tag’ , $args);در وردپرس برنامه نویس می تونه توابع add_action مختلفی رو با یک برچسب (پارامتر tag_name) بنویسه و اون ها رو در سیستم رجیستر کنه و هر زمان که خواست با یک بار فراخوانی تابع  do_action تمام توابعی رو که به عنوان پارامتر دوم تابع add_action ثبت شدن، فراخوانی کنه. به عبارت دیگه وردپرس نام برچسب تابع do_action رو با برچسب های توابع add_action تطبیق میده و تمام توابع معرفی شده را صدا می زنه.  حالا ما می خوایم همین کار رو برای یک سیستم اختصاصی که بدون سیستم مدیریت محتوای وردپرس نوشته شده پیاده سازی کنیم. پس تمام نکاتی رو که گفته میشه با دقت گوش کنید و قدم به قدم با من پیش برید تا این موضوع رو کامل یاد بگیرید.  برای تعریف هوک در یک سیستم اختصاصی ما یک تابع به شکل زیر می نویسیم. این تابع هم وظیفه صدا زدن هوک ها و هم وظیفه تعریف هوک ها رو به عهده داره.  function hook($tag_name, $value = NULL, $callback = NULL)
 {
  static $events;
 if($callback !== NULL)
  {
  if($callback)
  {
  $events[$tag_name][] = $callback;
  }
  else
  {
  unset($events[$tag_name]);
  }
  }
  elseif(isset($events[$tag_name])) // Fire a callback
  {
  foreach($events[$tag_name] as $function)
  {
  $value = call_user_func($function, $value);
  }
  return $value;
  }
 }  پارامتر اول تابع نام برچسب هست (دقیقا مثل پارامتر اول توابع add_action و do_action در وردپرس).پارامتر دوم، مقداری هست که قصد داریم به تابعی که می خواد اجرا بشه پاس بدیم. (این مورد طبیعتا فقط به هنگام فراخوانی هوک مورد استفاده قرار می گیره و موقع تعریف هوک کاربردی نداره. بنابراین مقدار null رو بهش پاس میدیم).  و پارامتر سوم تابعی که می خوایم به به هنگام فراخوانی هوک اجرا بشه. (این مورد برعکس مورد دوم هست. یعنی فقط به هنگام تعریف هوک مورد استفاده قرار می گیره و زمانی که قصد داریم هوک رو فراخوانی کنیم مقدار null رو بهش پاس میدیم.)  در بدنه تابع یک متغیر به اسم events با کلمه کلیدی static  تعریف شده. کاربرد کلمه کلیدی static برای زمانی هست که قصد داریم مقادیر ذخیره شده در متغیر events رو در فراخوانی های مجدد تابع نگه داریم و مانع از این بشیم که این مقادیر از بین برن.  در خط بعد چک شده که اگر متغیر callback برابر null بود (همون طور که توضیح دادم به این معنی هست که ما در حال تعریف یک هوک هستیم نه فراخوانی اون) باید باید دستورات زیر مجموعه اون انجام بشن. همون طور مشخشه ما از عملگر !== استفاده کردیم به این خاطر که اگر برای مثال برای callback مقدار false پاس داده شده بود بتونیم اون رو از مقدار null تشخیص بدیم.حالا دستورات زیر مجموعه این شرط به این صورت هستن:  در صورتی که callback خالی نبود، ما تابع callback رو به مجموعه event هایی که قصد فراخوانی اون رو داریم اضافه می کنیم. در غیر این صورت یعنی ما باید event رو حذف کنیم.  حالا در صورتی که در آرایه events برچسبی با مقدار ذخیره شده در متغیر  tag_name وجود داشته باشه یعنی ما قصد داریم یک event رو فراخوانی و اجرا کنیم، که در این صورت روی تموم event های اون برچسب foreach می زنیم و یکی یکی توابع مربوط به اون ها رو اجرا می کنیم.حالا نحوه تعریف و فراخوانی هوک ها به چه صورت هست؟ این مورد رو با یک مثال توضیح میدممثلا می خوایم با عضویت کاربر در سایت برای او پیامک خوش آمد گویی ارسال کنیم. برای اینکار یک hook به شکل زیر تعریف می کنیم:  hook(‘user_registered’ , null , function($userId){// get user mobile number by user id// send sms});  همچنین قصد داریم به هنگام ثبت نام کاربر ایمیل اون رو به لیست خبرنامه اضافه کنیم:hook(‘user_registered’ , null , function($userId){// get user email by user id// add user email to newsletter list});در نهایت هوک رو به شکل زیر صدا می زنیم تا همه توابع به صورت خودکار اجرا بشن:$userId = 12345;hook(‘user_registered’ , $userId);و اگر بخوایم یک هوک رو حذف یا deregister کنیم به شکل زیر عمل می کنیم:  hook(‘user_registered’ , null , false);و سخن آخر:سیستم های hookable به شما کمک می کنند که کدهای تمیز تری داشته باشید و به راحتی یک سیستم مبتنی بر رویداد ها رو مدیریت کنید. امیدوارم این مقاله برای شما مفید بوده باشه.  اگر سوال، نظر یا پیشنهادی دارید خوشحال میشم با من مطرح کنید. از طریق بخش کامنت های این مقاله با من در تماس باشید.</description>
                <category>&lt; فرهاد اشتری /&gt;</category>
                <author>&lt; فرهاد اشتری /&gt;</author>
                <pubDate>Fri, 24 May 2019 18:36:15 +0430</pubDate>
            </item>
                    <item>
                <title>تعریف helper function های اختصاصی در لاراول</title>
                <link>https://virgool.io/laravel-community/how-to-define-custom-helper-functions-in-laravel-bselc4jrzfqg</link>
                <description> در این مطلب قصد دارم به موضوعی بپردازم که ممکنه برای خیلی از توسعه دهندگان لاراول جای سوال باشه.  چطوری یک برنامه نویس می تونه در لاراول helper function های اختصاصی تعریف کنه.قبل از پرداختن به اصل موضوع، برای دوستانی که با این مفهوم آشنایی ندارن، می خوام این مفهوم رو کامل باز کنم و یک توضیح مختصر در مورد اون بدم تا بدونید helper function ها چی هستن!  در لاراول توابعی تعریف شده که به صورت سراسری در کل پروژه لاراول قابل دسترس هستند. توابعی مثل route یا dd که احتمالا خیلی از توسعه دهندگان لاراول با اون ها آشنایی دارن. برای فراخوانی توابع نیاز به نمونه سازی از کلاس خاصی ندارید و این توابع به صورت غیرشی گرا قابل استفاده هستند.  و اما چطوری می تونیم چنین توابعی رو به طور اختصاصی تعریف کنیم؟ در ادامه مقاله با من همراه باشید. ایجاد یک فایل اختصاصی برای helper function ها   ابتدا ما باید یک فایل php ایجاد کنیم تا تمامی توابع رو درون اون تعریف کنیم. برای اینکار در یک مسیر دلخواه یک فایل با نام helpers.php (یا هر نامی دیگه که خودتون دوست دارید) ایجاد می کنیم. مثلا من در دایرکتوری app چنین فایلی رو ایجاد می کنم. بنابراین این فایل باید از طریق این مسیر قابل دسترس باشه: app/helpers.php معرفی فایل ایجاد شده به composer تا اینجا فایلی رو که حاوی توابع هست تعریف کردیم. اما توابع موجود در اون از طریق بخش های مختلف پروژه قابل دسترس نیستند. برای اینکه چنین کاری انجام بدیم باید به فایل composer.json بریم و مسیر فایل رو معرفی کنیم. بخشی از فایل composer.json که قصد اضافه کردن فایل helper function  ها رو به اون داریم به صورت زیر هست:&quot;autoload&quot;: {    &quot;classmap&quot;: [        &quot;database/seeds&quot;,        &quot;database/factories&quot;    ],    &quot;psr-4&quot;: {        &quot;App\\&quot;: &quot;app/&quot;    }},&quot;autoload-dev&quot;: {    &quot;psr-4&quot;: {        &quot;Tests\\&quot;: &quot;tests/&quot;    }  حالا برای اینکه فایل helper function  ها رو به composer.json معرفی کنیم باید در زیر مجموعه autoload در فایل json  آرایه زیر رو اضافه کنیم. &quot;files&quot;: [        &quot;app/helpers.php&quot;],  تا اینجا محتویات فایل composer.json  باید به صورت زیر باشه: &quot;autoload&quot;: {&quot;files&quot;: [        &quot;app/helpers.php&quot;    ],    &quot;classmap&quot;: [        &quot;database/seeds&quot;,        &quot;database/factories&quot;    ],    &quot;psr-4&quot;: {        &quot;App\\&quot;: &quot;app/&quot;    }},&quot;autoload-dev&quot;: {    &quot;psr-4&quot;: {        &quot;Tests\\&quot;: &quot;tests/&quot;    }  نکته قابل توجه اینه که در آرایه files هر تعداد فایل برای helper function  ها که دوست داشته باشیم می تونیم اضافه کنیم.پس از انجام این کار در command line دستور زیر رو وارد می کنیم:composer dump-autoload  و متنظر می مونیم تا عملیات به اتمام برسه.  تعریف توابع پس از اتمام عملیات تمام توابعی که در فایل ایجاد شده وجود داشته باشند در کل پروژه قابل دسترس هستند. به عنوان مثال اگر ما تابع زیر رو در فایل app/helpers.php تعریف کنیم، می تونیم هر جای پروژه لاراولی که مایل باشیم اون رو فراخوانی کنیمif (! function_exists(‘sample_function’)) {    function sample_function() {        // ...    }}  لازمه بگم که حتما باید از تابع !function_exists استفاده کنید تا اگر تابعی با همین نام قبلا تعریف شده باشه از تعریف مجدد اون خودداری بشه و از بروز خطا در سیستم جلوگیری بشه. و سخن آخر همون طور که اطلاع دارید php زبان برنامه نویسی هست که هم می تونه به صورت تابعی و هم به صورت شی گرا استفاده بشه و اجباری به استفاده از برنامه نویسی شی گرا به تنهایی در اون وجود نداره. در فریم ورک لاراول helper function ها تعبیه شدن برای اینکه کار برنامه نویس رو برای استفاده از هر دو روش راحت تر کنن و استفاده از چنین توابعی که می تونه به طور اختصاصی نوشته بشه باز هم کار کد نویسی شما رو راحت تر می کنه. اگر سوال نظر یا پیشنهادی در رابطه با این مقاله دارید خوشحال میشم از طریق بخش کامنت ها با من در ارتباط باشید.</description>
                <category>&lt; فرهاد اشتری /&gt;</category>
                <author>&lt; فرهاد اشتری /&gt;</author>
                <pubDate>Thu, 23 May 2019 12:35:10 +0430</pubDate>
            </item>
                    <item>
                <title>push کردن پروژه در سرور با استفاده از گیت</title>
                <link>https://virgool.io/wptips/deploy-project-to-server-with-git-tcvdaipn0awn</link>
                <description>سلامدر این آموزش می‌خواهم به یک موضوع جالب و حائز اهمیت در گیت بپردازم. خیلی از دوستانی که چندین ساله در حوزه برنامه نویسی فعالیت دارن با گیت آشنایی دارن. اما موضوعی که گیت رو برای خیلی از برنامه نویسان جالب می کنه امکان ارتباط با سرور و پوش کردن تغییرات پروژه در سرور هست. در اینجا یک تعریف مقدماتی از گیت ارائه میدم و بعد به ارتباط سرور و کامپیوتر مبدا در گیت می پردازیم:گیت یک نرم افزار ورژن کنترل است که برای دنبال کردن تغییر فایل های پروژه و دنبال کردن کارهای انجام شده روی آن ها مفیده.گیت بیشتر برای پروژه‌هایی استفاده میشه که چند نفر از اعضای یک تیم برنامه نویسی به طور همزمان روی سورس کد اون کار می کنن. در این جا قصد ندارم گیت رو آموزش بدم. اما می خوام به بحث ارتباط بین یک کامپیوتر مبدا و سرور با استفاده از گیت بپردازم. بهتره یکبار برای همیشه با این مفهوم و کاربرد اون به طور کامل آشنا بشید. مطمئنم بالاخره یه جایی حتما براتون مفید و موثر خواهد بود. و اما اصل مطلب:دو راه برای اعمال تغییرات سورس پروژه روی سرور وجود داره:راه اول اینه که به محض اینکه یک فایل از فایل های پروژه رو تغییر میدیم بلافاصله اونو روی سرور آپلود کنیم و تغییرات رو مشاهده کنیم. در این روش برای ارتباط با سرور از پروتکل FTP استفاده می کنیم و به محض تغییر یک فایل (حتی تغییر یک خط از اون) اون رو در سرور آپلود می کنیم. بیشتر ما برنامه نویسا با این روش آشنایی داریم.و اما راه دوم و روش بهینه تر: در روش دوم یک ریپوسیتوری گیت روی سرور ایجاد می کنیم و سورس پروژه رو که روی کامپیوتر مبدا (لوکال هاست) داریم با هم دیگه به هنگام سازی می کنیم. در این روش به هنگام کامیت کردن تغییرات روی کامپیوتر مبدا و پس از اون پوش کردن اون ها روی سرور اطلاعات مستقیما به سرور منتقل می شن.قبل از هرچیزی بهتره شما رو با معایب و مزیت های این روش آشنا کنمدر روش اول (یعنی اتصال با استفاده از FTP و آپلود فایل ها) پهنای باند اینترنت شما بیش از حد مورد استفاده قرار میگیره. چون اگر شما به عنوان مثال 20 فایل رو آپلود کنید و هر فایل مثلا حجمی برابر 10 کیلو بایت داشته باشه مصرف پهنای باند شما 200 کیلو بایت میشه. (البته درسته که این اعداد، اعداد کوچیکی هستند اما در روند کار یک پروژه در طولانی مدت مصرف پهنای باند شما به شدت افزایش پیدا می کنه). اما در روش دوم (یعنی با استفاده از گیت) شما فایلی رو آپلود نمی کنید. بلکه تغییرات فایل ها رو در سرور پوش می‌کنید. (حالا توضیح میدم یعنی چی!). مثلا از همون مثال بالا استفاده می کنیم. اگر شما 20 تا فایل داشته باشید که هر کدوم 10 کیلوبایت باشن و اون ها رو در سرور پوش کنید اینجا شما 200 کیلوبایت پهنای باند مصرف نکردید. چون امکان داره که هر کدوم از این 20 فایل فقط یه خطشون تغییر کرده باشه و گیت هم دقیقا میاد اون یه خط تغییر رو در سرور ثبت می کنه (در واقع تغییرات رو در فایل های روی سرور اعمال می کنه. نه اینکه یک فایل رو به طور کامل آپلود کنه). حالا وقتش رسیده است که یک راه حل علمی یاد بگیریمقبل از هرچیزی لازمه بگم برای این کار وقت و حوصله بزارید و با دقت تمام انجامش بدید.شنونده خوبی باشید و تمام نکاتی که گفته میشه رو با دقت گوش کنید، بازم تاکید می کنم که شنونده خوبی باشید.اول از همه باید گیت رو روی سرور مجازی یا اختصاصی مون نصب کنیم. فرض کنیم که شما از سیستم عامل لینوکس (سنت او اس) استفاده می کنید.بدون هیچ معطلی شروع کنید.برای نصب گیت در سرور از دستور زیر استفاده می کنیم:  yum install git بعد از اتمام نصب برای اینکه مطمئن بشید گیت نصب شده دستور زیر را به کار می‌بریم: git --versionبا وارد کردن دستور بالا ورژن گیت نصب شده روی سرور نشون داده میشه که این نشون دهنده موفقیت آمیز بودن نصب هست.بعد از اون باید public key کامپیوترتون رو درفایل مربوطه روی سرور قرار بدین تا بتونید از دستور push به راحتی استفاده کنید.برای اینکار در سرور از دستور زیر استفاده می کنیم تا بتونیم فایلی رو که کلید های عمومی در اون قرار دارن رو ویرایش کنیم. cd ~/.sshحالا کلید های عمومی در فایلی در همین مسیر با نام authorized_keys قرار دارن. بنابراین دستور زیر رو وارد میکنیم: vi authorized_keysو کلید عمومی رو که روی کامپیوتر مبدا وجود داره در انتهای این فایل قرار میدیم.نکته: برای دسترسی به فایل کلید عمومی روی کامپیوتر مبدا و کپی محتویات اون در لینوکس می تونیم به مسیر ~/.ssh/id_rsa.pubو در ویندوز می تونیم به مسیر  C:\Users\Farhad\.ssh\id_rsa.pub بریم.که Farhad نام کاربری ویندوزتون هست.در مرحله بعد یک دایرکتوری فرضی روی سرور می‌سازیم و یک ریپوسیتوری گیت در اون ایجاد می کنیم. نکته قابل توجه اینه که ریپوسیتوری هایی که روی سرور ایجاد میشه باید از نوع bare باشه. ریپوسیتوری bare ریپوسیتوری ای هست که روی سرور ها ایجاد میشه و برای انتقال فایل ها بین کلاینت و سرور مورد استفاده قرار می گیره.برای اینکار در سرور به مسیر زیر میریم:cd /home/admin/domains/domain.com/public_htmlسپس یک دایرکتوری فرضی ایجاد می‌کنیم و وارد اون می‌شیم:mkdir repo &amp;&amp; cd repoو سپس یک ریپوسیتوری از نوع bare  می سازیم:git init repo.git –-bare که repo.git اسم دایرکتوری گیت هست. درحالت معمول نام دایرکتوری گیت .git هست اما در اینجا ما نام دایرکتوری رو به repo.git تغییر دادیم.در مرحله بعد باید وارد مسیر زیر بشیم:cd repo.gitcd hooksو حالا از دستور زیر استفاده می کنیم:cat &gt; post-receiveو سپس: #!/bin/shgit --work-tree=/home/admin/domains/domain.com/public_html/repo --git-dir=/home/admin/domains/domain.com/public_html/repo/repo.git  checkout -fبعد از اون کلید های ctrl + d رو می زنیم.منظور از work-tree آدرس دایرکتوری هست که ریپوسیتوری توی اون قرار داره و منظور از git-dir آدرس پوشه ریپوسیتوری هست. (همون repo.git )بعد از این مرحله باید به فایل ساخته شده با نام  post-receive حالت اجرایی بدیم. برای اینکار دستور زیر رو وارد میکنیم.chmod +x post-receiveتا اینجای کار، ریپوسیتوری گیت روی سرور ساخته شده و حالا حالا وقت این رسیده  که فایل ها رو از کامپیوتر مبدا به سرور منتقل کنیم.حالا باید ریپوسیتوری رو از سرور clone کنیم که بهتره شما هم دست به کار بشید و اینکارو با هم انجام میدیم.روی کامپیوتر مبدا دستور زیر رو در گیت بش وارد می کنیم: git clone ssh://root@192.168.1.1/home/admin/domains/domain.com/public_html/repo/repo.git به جای  root می تونید نام کاربری که با اون وارد ترمینال سرور شدید رو قرار بدید و به جای 192.168.1.1 آدرس آی پی سرور رو قرار بدید.حالا سیستم از ما رمز عبور ssh key رو میخواد که اون رو وارد می کنیم.و حالا یک ریپوسیتوری خالی در کامپیوتر مبدا ساخته میشه.و در مرحله آخر فایل های پروژه رو در دایرکتوری ایجاد شده در کامپیوتر مبدا کپی می کنیم و سپس از دستور add استفاده میکنیم. به صورت زیر:git add .و سپس کامیت میکنیم:git commit –m “test message”در انتها تغییرات رو روی سرور پوش می کنیم:git push –u origin --allدر اینجا سیستم مجددا ازتون رمز عبور ssh key رو می خواد که اون رو وارد میکنیم.حالا اگر وارد ترمینال سرور بشید و دایرکتوری مربوطه رو ببینید مشاهده می کنید که فایل ها به درستی روی سرور پوش شدهتبریک میگم! شما تونستید انتقال فایل ها رو بین کامپیوتر مبدا و سرور با استفاده از گیت به درستی انجام بدید. حالا دیگه به عنوان یک برنامه نویس حرفه ای با مفهوم گیت و کاربرد اون آشنایی کامل دارید.اگر سوال، نظر یا پیشنهادی در رابطه با این مقاله دارید، خوشحال میشم با من مطرح کنید. از طریق بخش کامنت‌های این مقاله با من در تماس باشید.</description>
                <category>&lt; فرهاد اشتری /&gt;</category>
                <author>&lt; فرهاد اشتری /&gt;</author>
                <pubDate>Tue, 21 May 2019 15:40:40 +0430</pubDate>
            </item>
            </channel>
</rss>