From 7f208feda6e5b7b01fb37e33d1293c11f514aa50 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Tue, 31 Mar 2020 20:21:54 +0200 Subject: [PATCH 01/10] Add git documentation --- images/github_branch.png | Bin 0 -> 42865 bytes images/github_commit.png | Bin 0 -> 25815 bytes images/github_edit.png | Bin 0 -> 19447 bytes images/github_pull_request.png | Bin 0 -> 14374 bytes packaging_apps_git.md | 85 +++++++++++++++++++++++++++++++++ 5 files changed, 85 insertions(+) create mode 100644 images/github_branch.png create mode 100644 images/github_commit.png create mode 100644 images/github_edit.png create mode 100644 images/github_pull_request.png create mode 100644 packaging_apps_git.md diff --git a/images/github_branch.png b/images/github_branch.png new file mode 100644 index 0000000000000000000000000000000000000000..47987fb2b6e84283f09fbf6fd9f177f173a7e4e0 GIT binary patch literal 42865 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 literal 0 HcmV?d00001 diff --git a/images/github_commit.png b/images/github_commit.png new file mode 100644 index 0000000000000000000000000000000000000000..d299c878ed36953eaa075fdc5a628be3945a8458 GIT binary patch literal 25815 zcmeFYcT|&G_Xda!t{|e)lzJ(mbVPbp5HR%Ki_$wtCzOb&h=_C$DM5M%snP|c_bwel z2qc8iLa1R*y!W?ezTf(0)|$U(G#GsIz9*;bv-h)~{hV-3btQ6AI#MDcB67&nC)z|r zmy(HyE*Skq46fW_K{bFkVoMdJCq(CjzZp$=ap1~T_oqglL_~aSgr5t3IkG^y$Udw+>Fk?}hd7Vw&8p-qTnxVFw){A~Js0 ziuP%6APkG>k&3|RWx_8+avX$zUq)Xgy!~x`k?=Om?x{mhm6TXi)z6pIr{Hvfa8c@m zV%F(dAk{hsWi+`yWQ7TuxBpwm z{sJol{@f7!)7)#-KmTK)B)mQ9mSRY%{7my_01N@$JUl$Q&t5X~{%K9DCfdl*@IHj} z`t{s5e;!g|7QFh2@Y_q8tI3!DH1sIqwd%z`vyq`7$8q6LtHZ1;aWDT&js4eX$e&9@ z#yr+cpIW5^vi@BEt`(-bv6NGB`Oh%EKL}HO^=}*U9FHqk=g*hg-$!U@ng+g#jnh#- zSt0cA~7}0 zDx~l_>|8_W^!=iN<7%O>1TM95;;VdsA}gV>v4_@7Wf^rrUF!4hedyl){=(Y14KK&p z1IC$}ps+RAc1-&D&=_5^*lCshTo}`*93$M^UC8dxo>R(%@T-`$N(N}6Knd-$-j%Jqy`k@-*m)Uz->LZ3@`J)%Vypk0&#B;=cAS1baH z>C0Nwv>FmKk)|Ye>>XE0 zh_5>N7C$!J6f;)ZsGrpdU!7j-G_k$UC-YeLtm0db4-Ys0ROL`hekBLIEdA=G3Ew3F zGk-MJxXuy#9QWXMLShRG z3%#)WDOJz`;~^i8I0z?a0rX_v{}_pK+ut%ND{?ZWg~Sfn?p+=;Kr|QR!Gjhm7nkq0 zICl02>?0hKHhw8F<9HS;yi;<`q|H=7`69h{7k<)5rrZE;$d^_evcAU*I@%S>QZD!3Q8pqG^0evK5G#>R#5<3bSaCw||KIrd%MB|}>? zBJ#|au6~N$U+yb|URSsr4(?h+kmA{AFIp%%`4iIe!q`*9V4;t#ScdEjV+EHSj zY%7x~qIF*k!Ynzj?eRBnUi}11_eq{CG0k072__iM2eQzeC4s=>WQ0_o1$-}-CU7U5 z=KL^iIbdJY#wG`kkAg83&q`vHW5JbS{^q7vZJQf|0jnRJGC9mP5AnrV_^Z z#=38Y(}{SM8tH;uT3h@nr9p`NqepAJ4yB7&?>ImQpSa;R=+&z_BRj~%CT~< zLWNf*Q*0`ysctfrlGx5?$)>?d2gL(owYA46rg5VxxyaFoyh4*HG3nE#v)#RtAR?{N zt2O?Td3@+ z92m7}fyAB$26U1R5H4c7nTVDMADJ#u7{yQP<*&7Soz79z8WRwMv|d znwrjYtr+$K-=Xv{Q_ES=FHyl~E_Lh#iiZl*jVDB ztejqP8V83BF3y6cs;U57sbI2dx_2lE`S{Y~OB4;5^%yoOxQj@NgqMBUfJseZe*VwO zz@?Y?-hsX`{)i+(R7y`)${M+!)R$9;L=yKgi7zkdye!d2vDnbkCgo>l%EgX9Y*uOt z`y0EyU}kP^o^A!vHip)39?YOCJw3e7)N1`Fsi~Qz7E5MpxNFQlbVf3k%m*BB-4#|N z_;Ry)Fa7i8t8_BX?>Iit_i2cNfxAn*?JpnJymO7XZr(K~$4)4qCH4%5g2cA8EV7_b z&9}0viZ`RNt&bn451E^jU}B`)dz@SZD*R-aw<>xQxe$iqE@ZM6Eo?KQLhRWKIGKfo zuvA3Ap6u|7hRoft_UTL;S{laGj)R?@g7Yqt(8s~S%~&~GfB!m!=i|pA!A2ETtt)GY zsX^nx#uXnuJv~%tl#IT&cXe#64>zYnt<3SE&YQPy*OOt=Bfo9B32S9+)V;s6qi>ot zI8(|+ zpck@~m;&TnYfaK5y~iVlq_aLU&h!C4rUbvBBy@7Bx`Oe6( zjq&uR6Kla_ug=#m>M>i%$G_YCq1*Tq_KD`}cC$5%r}3A-VDe158&5|gsHbuc(tChu zIgI+#uD_Wsvu|y4!wv@Qd1Jjrk;w>0i^^XJ1Yv%-fcIA6Pv(LEzldG8(&%aI65^;nPkBUBT0C5uirJ^AzN>y5$c zLJ#U_s{t}YFH|Z8L2**co>xgp_X8Iyec{Q^^Y^sz)COfAzn|xWzjt^S;i=N(Rf6RHo;?ff=v!L9SH*b0ed$iiV zKbLUYJ%Sz_B}s++MEgvotX?N0Tg_ttQy>BH?(!>DwWHuBJ!&eeiBJ{_MOr+ zXJ*Q||9pvUK48kit7A2Z$p_xBmHK7TpmcO0s0Vr$S&Kbr*h9|CAAK)Ap<<-={(%s* ze*^;?;l6CkBQg;9)lx*cCGQ!aEi=8(stue5QEvCy*mMZs#||F6`>wAAyGCE-HSOjh zk@gvfSNeS33IoAmqRj18TYFo4N|HfKIxP8%O`iebvGZeGC3I)i;I~JebY;f5FGlsv zWfGNGzI15FLdto_Lg0y6(Eg$Z6%|!>?5Ot8iRh4oRT~S%YXT5=54@u>9>O~NWPL1Z zZKL2G{>#@aB~B?GRhkH+g@py=q_Dc^ynxvv|6#>KfDmB@gIDzCWl>C6W1L1#iwiaIivmY$h;{eth$^zlRShR+@_pPDGy+rN`J zb8iNXhi7JG>YAaWr>#fJzl35tiz>ZG-q8BhoXuLCYedN&mlI!K=P#Nl+)QPdcGkzD zQZfj6!ujb5B)IJl&goxr{VmZQzwg|kSoslpqinBDtt(r<&j2{i5ME5D-x6EJ7c71>9Vv-EY18dV_9C0Uju( zkz_8V_w_4U*Hk;Ru+Y&PGpY9w^DXU9ww7x9spn7P$3SWOPp;T?<$uz|KiB^=gZwwG z{BIfOqwfFP`(IMF2eMv|O-#;;9rX}TQ#U5;H6ryl0`?-@?DsWeZnBhcTj$!Wf!L=V zbMuQJ-L=@c{Xe;3sxEQeoa-trRS$2{jNcJ?|WWFR7no5XbmKJysUwZt{O}5{?8s<+bKO3LcDDH(9ynPHl^O&%>HLaBkL6dPZ)RpY^9}i)UDwkwd%I*+ zfvd*V5w1lbmM|UoDP}#UDN=ae%7Pq!p#M1J0=A|oKYuiNMG-pq>*a@jo)V)LBQptK z&8SkdkB6s(*_PTgs(L{@z z+mMf$gtw-%>Nv}ZNikObnWORBOjfq|n1rl!>3XJHwdbly9FDz@xX3rB zlww@kD12(Bv-kUXyx+MPxSj8Ra5mxzyZ&Y^osjAhRrN+2>6w*aV5XVPO)J%+cl8ny z^mY#pMqj>O*xlJlWT&R0aac)oshH)aW}wO+9$tdlP|;93p+1^%adIY%*y~!S{Dno1 zsBy$;wVX8@zj@PPY*GPnnSGLPA;%Ab!c2vC9_jmtyS3xFYTu53_{Q~EOKkcZ^KkeF z`1?2G0J4azRHPRn#E*lkEtWP=6_{AmjD0T~bnNItH)quPL6vBw}gmyr;itv6wNP z0G%;i*IMpj*+)&w4Gw#gj9j%zeU@MCpDoG^Y;hB&p+uvo{@&grF_oe2(e2ht-km>V zcK5Io^=c;U5MaYalP;Pm+wN+q0><+VKKdTYpY33^vn6^ck^5rzHSHpqOK!FkbMnht zoM>yaL)ycx#dlb0oxff{CJn0q=)*nb99twLh9!WoxO+FpLsyb|sxB08Wv@anPSmKq_SoH(V)6D`)=XBjy%VW;bbNRp ze7}N14ms1kmhz{ot3Hu*GKL@{2e0{MiH+LDsrz3HqHGu0jLluA2BiZgIHZafWM+N0 zMn0MaP)y_dUt~#PRUmzuUb@-roE(KEfF&r29TmKCcp?l{O_|^-8pwSAJ~U+1S&&nZ z)zl%`2su-i#m>q0&?If9i%a_9NwnZ+&tMo8<(NKk=wtl|h2UTr((Bja2W%7AuaI0R z$j+`QAtQ~TL;o4;>we14F2vH^RPz&l%96rDZ5x{e9-7Mjwa^JbA!(_n&1oAN7H2n| z=$gAGUDJ*n%h?`|CXUj1UKTxzo)ld?4_vSBRX#cv3gmQ{ch{Hn+|UPWkKLGPTJTAe z_#xsql+~k4|0LqQimtJ7>8JdfYVYc4DwA2E~GlEOkxbfB*(wXOzJgN!z1 z`I-=;WRUICT}xI=vyexcb2tmpNng;3{lJms=;+8^VD!gFy^QuB|3Dm?s*Ygk1C*(a zz-_6dUghc}W2S4`)o^mb@nDhh#q&q`F#r|_mYCOS1wp+H8rJUv_v^AyFHcRKKn{-^ zxgXI{98THEpk;=9TluPu)n%bZUb?;u5CfC5r3C>@aXNs-Y`~5!FCr(J%Cn#B%rDcC z2Y^cq6Y57t$CD;ZOmwVvYLTQ7?-MLE^YgpA+XuUudZd%X$ZLq(pVv4wmJxQ$4Z)~z zcv%!FX+-romwMFP=|w=ROp+!0G?=wM4mpuE=zS*8ZClyvSlzSX-fN`8wucY6)`up! zWc}hrIFEj%rBx;cA2(;rgr&=NYG6>%Z+9^;QPEMp=yu1{LAr@=j@FgN6edaazxu(p zpBDF@DR+o?OU|TO#uWKN!YMu`xnx1Qfm2Fo|5>+J!#-+v0?;Bmri!!CXi1;G*)A0p zm|sRz>oZMN-FU%D&xDkuJoBA-4P}_YW+@gvKFCaiC__|m z@hk4*`I!~kJ^^n$_DHKduuvPsTA^E6I{Dj~Px()C?5x3Tk1grg04Eq*B`U7qu#v1Z zv8aZn2BUsCxe=e-bM5N&(ddw~Dkq%z-MmQ|oAJd(4SC`N9Y4df0FGG&C5H}VH5Y%G z=A)Nz;!PMXd)j&OJ3gq&A9WqAqOJ$n3<=*46Y0NoA=-xa<(9JwDBuFR?S=BKPJEEF z4S9)W##sqYlTO<&n;jQR(|k5(vKmk2$nX5rIHQCT+^_L|UzyBc51%K3wC5_8Hw z8!f|I@Eg5wJzn+RFOtr<60H$@T&tvHkhX4!Sh4Cl|u5{>d<3 z=GK{(&J@YVjg8-v+4|I5n8Fw-#7i)wjGTV~2yd=l)4egruj_LV%5`DFM`8*O;{LBy zivK`uM0uLs&cD4=2{*o^-1M`lT4555RLnAUt(`k*AzUT8C;O~^-W7n=ZfDo&q>l_Z zgHNyDUgna#XL0ivONFxF?Q7t*&qcU3^~Xyiv^&?mGR@YK99X3HCc zL=iCVch2w50OoaD#N2!iZcx^?eqtB_7b85pG~PaD^WO>-f56s%R$BgZ4F41~zH@f` ze+F0nTYQ?9B7iK1o{B7U7*`Rnmx(q70EnbZK6+<%JyOBIDmur%?rS-1S%CQkzS77% zIHcM5+f$UN>k%CFp*YnvApww>G?hl}#1zp{Q9}+o_ZXVk7%B2r3<;~nvX`HoYjdAV zQ0|VAxQ7_SxlUS4l^q-*D#qncVE*`GQNyY|UZEdcsk^F9vo5+c*6jhF_ zRP{U>{B{H}7L_&M!&z8dOu#dX3)0j}n5k#}2k(_ZyfM3?&;c?8fc5pu4qYpZK%_05 z#L4o3`*vnhVhekFx%>kH93IKJ9Ub}s4`EPLUT)~5B2wT20OJQtE{2A8a{UJj>0jG! zRhw(6PFCJ7%60Rlye7Vd8Q%;&R9t3W7ik2FCaZFwRUi|C^8v!H)|vgbafOW6&l-P= zVmBA`I2|^y$Z`HJ23a=3c}!~97gnpx1GmK|SHKf`qYKu0dis59HhPHbUy(m$^ka4P z%}doxeDcfl4fRtL(j==4x(?7F?(Cy8JCL)I<|aOyy0~wH?;Ytk?of#E&q5egz)C!_ zQZGpE|KIRzyV$eN)VSI;bmn!K)AH*P?V(QrN`fcNiT~VaS7o51X9bf--7NtED;Vc)NT6*rivP z{x^E1zt_d}55@-OB-XCJKW(vLy zGFl7K5i*Gy7gnhgk!pO@HR4dkd)M`9`O<8J=vGlHS?{(5sHrDlV#+6g0)gEwG384FUw#YP!7VPVmTWYwJk+fV zPoIw}EY3xa=rW7y;bT6=SV^akZN$&=g7vu*Nes{?62MuiB~0F{OiR6=+~d-vgcjxG zUroqv0PAAA*Q#?sfT!kYMDC<$HrOnX09--i9N(R6x;zz-=3r}fb`N#~Mee8-78E#? z^90nH=@%*J7p*Ss1O);7Mu1P=Fu(khZEF6qnTn#qLhEY7>jCL%3FsB{{O>xEyi)Rl za)WMAok+pJWW3C5asq<_f1^-Yd}$K)*m^bOG@H7N%z~0$A`X8bW-9#|xsux}JNm$* zxQmRmm^??8|45CcHNkyI=+~^j`M^bPPD}v#LYUAwfX7x5eJ-@QsL@MaN#l;tEb8+;mXq`M^+$rd)L4 z=JOML63PJUr_^p~Dk#`Aq32w252gn6RtgRBpa`Cx?Ji2$-Uj}m1lUaH?X4?N*G23@Kzt{l`wXwD>@*Q#oNZ|L<)H{|~696(}CLH6&e#KV~@*k}p zgt8PAU}3tZrmPVY#Xo_;O1pO4y{lwK!fe5;XCSEy(4LXLzBylL>)*_ap%2x48kzS-HupY z&U*A&d@p)6tg$|)&W1Uvp7;v!{rmSHnbd6QdRNPXai`QcPkr{LmwxQnzUG2tnu3H} zz$0gJLPcB`3O}D!T6&|#b&b><{!bspf0x&+FW3UCp$9Ohgv5lRib7=>8ITW>#>3%J zH7<)eAo2jF%5fzTjkUd(;vv`>%P!7v-DR$#>0lIfrad~E5SwUz@55~Mi@t;Nx~Usr zk1kPNP402H^FG{hb_pc}a+CNZi+rSG81VrnYco|U=zQ!JdZtMuO|lbODkhXN5LtSj zRX+Tzqb6d~t)*;4LnSzF2YXh197gzCkX?8CetS&h z!xk4}9pM~KUq4Bgecrf1&kf>r+6i3bq)S3rUtj0*SXX2MEZge0VH7PrC2*ncXEh$x z%}02<64M6rG>IyMS&^FnEYeA3z&EKA0B{j3nXOU)={t0*&-r8AgGBa%&Q)zdY;YA7 zO7(eolEtS4xYN`W78>_(Iuwe(8omZl>R4#&eD{C>=f?E=NLNo)lAqtalO(F6Vmd4j z8kv5+FlKLvtO%I*UR>X5VG|dhxLVNi%Ey9Y0>L^)KsH3ir2lYq!MqB z4ZXIquL@nhO$fGPCI3%|`G3i0{-D!;!S}y9p#O$WiT)dp`v2b#*7JY#LH{vp|HA$M zI&1$fz(4oD%-Wf@gBN9FME@hj5);`&3>c_-RmsV{y81`<^wNs#6R3iYWVD8UR5|+R z;X`J!PfbwV=$M9V$@}-D|1j7~KQFGS@Hb_TWGVK|&Ng&JS>+ZGBIgo}|CtYReB&EK zMDicS6X9u4WB)82Py^EGfBONx#jSBCx3qbU>&@%eRSVG@J`Ees38p4?_u|?FsQkvx zySfFjjM)qI0s&XkIT_(I_rRco4Ljs$P6RQ<9iR?KYw+5++~3=)9JF(U0H8uJ#pFOs zn%I}EhySj$$=4B=j~hhE;{IIRMVe3i-WAhS0_<>&_)^n#LStQ!$H5_Ta!&kjO3G(f z(JO3_-XVU?r%%g!`}$VhC-bX{<${A39O-ZRsCE^lFh-q>*~}`w=2Y0RvNK9#=n>9e0ijF?>99E$k}*mCu#vz0Q|>a81pzhUOWRYtU&ZxJp9a8c z>Kbboo6U+iOjN+Dy+$tbnpHh2N<1T6DyYgf1e~gCZA!YM9MEknFH=@|8jNb8&quo8 z$o|S9r4emh-@AK;fyVi)5n0+aKSA)DgC2#AAE}*;iHf~fC z(txu+;4X8V-d)r)HqLyv{g>KpS^e61kE~Z0FKIxPjzQAWRBKMKXZDSxyDAehBKnMy zRkCXp#xq}2O;i%cv=JlG%7_gdTp>qi*G7a;+fWnZe3%USVj^0cm{o5qulPadWYBCC z!F)fihaJ3HUOuYE%;|+HeMrixS0>ywHhsD{r9DHft?n zGG2*!l-$3j*sdNZhZX^o3H-OC{`XXDZCCZ-6tzdgJa`$OqDTjhXIGRMh0YJUt&mf- zQ48skO5yEqxk^=N)ucRMt+njE1&X_BJ2w~2p6>4P$lCtljOSVLV$fH%{f$bXz#N-h zvFicWb-m~cnRicBk&xGKL$iQ(-kAn|qp1b=h)%e$kxs68Vb%VA)=cx3O@x7|w3*XX z$rKt^XX3l)3k&r&Zg6cHOcvB@I-wZRo0`vPlyK3hEv~2#Bs3d0)I7ZOD+{}DO2G~( zaM-BF=gtb*|GbZ-Pt8AJ4*X{Rb0I0UxTv(@G2!t~SL1{*XB2k}Mm!sUy6qSTGtaNx z1l9KSHkDjP4?KConBj@29SowZrZzUNQl=T$Mx-Wzxp)__Q{PI%CE(6=b>jEXKTT>} z$A0he>tgWoUeoY0Eyo%Bi@;AimCsi=%%B|;%D2UIik4O7CFjY zI(b;hfjTAQA1Tew=IAo;{A1O5M%_I8+v2fb)sV;_h&IkVC?P4XV7FqFqwoB1 z?+Pf$c>OxELq$#xtrLFQ_J$IHCNoOb!ub8WK9?fgJjFwvK^K6s}V zbryx6eRjs1ID=wqF)!C-?hi1bRTZ}YdtY=eFlDAXVk8#cJQlSWR8qXjAbq;Nk}k_W z=Y?WKj@DHIAy!Fx@a}^%)Z&oiM#UnXbS+tKY8iivxh95b4g)*XLck^KdL%?9@B=Pc zxP|ja8d3-E5_$1jH-9~ct{u@zdpi~n4piGtC9W7oQxX zMgLJd7CXbuztMq6A93AgUZzh==N@)*7=ni+P&P zI-Q_v1^4zR5OC<^DqQZDP2% zc%+u$asC)sJ|f*;IRbX7zhG|u*?%Y~j8PVphiV5u6ZrWQo z!FJ-q&d;8>H6K(2pSp%f_#*S|;IM+8oe5o80Hl_Lt|d?3DR}?hfj@L){c7yQ#02#D zLEmS;ts}zEAAy0pm=r2fF>a=_%D_j_IMl}6XMi`o>~5ca_w1~SPG0JYk*s&GIHBAZ zYr~CnnPn(&sP5XNo5~qMi#X2}n?V|cQ40;f5vZc!;T!WFW7uQ=om+sMX1t~ildu3m z>HWq@zU0o(llciJ5zo`h)jNfQ9=#KkUV zc!^|xifjmP^6UBYNT!w4%6nY=q8de$#R=>=+1ZW;qpoS52R}Ga<8udYy;XgDT1kUx zR18$v5WBREducK!?Dp?Qd;bjay3y<0+5R9R{L0d%0zE^#o;qqSAG zF;K|DtN}aBTf11$gHRjkVs6INol3E@>zatVX+M7);@YsnHvnC7BfUl{vHZaMD2KKP z$cRXAI0m6~#4)a*N2y+#Ufs8oI(IiIxoCt)E)JDwB_H zLL4b?ZW*~%8dKBVT0UB^tj;g25B^(X6rIBMklW<(c zLBFAT%MMMlYVM2(W>|}UvaDq4T+-KBC#C!8n=mE&-Yc}i{>5#tF0QVwIxc0jR%4xL zi@twH7G5M0`>9?uueBS^Ng! zAM!T?x?jQDTAI$+oQDue7BD51#FF8A7Cggm5L4#1M?JLF zNy8tN846SKEc~A!=;`SJWmg~6z{)nuP_gjKz1PyA@lH_@YS8P>M}bqOjRUo!($Y!h z2nWZSAydSH5kG&*#fzuawhHZEywLSn59U=JOT5sk)O^t58T7D~WPctP;WeOVQ1vJ% zMRv^Z+ks2rpi-N?5E^3?s;U?VAT0v%yz9Wl7<=LYN^rlu#8wN(KH8~DnW(^yAbX4c zDvEKCtj-TQa*M%{=Z$*$K=bT$us6iSP^lgUur6+@)<@q8Y<0Z zpO>)8WePfctR{|ONCp#q@S{Zv_d-N`lKd@4*HjOblu#~Fm+Ovy>@oH2x5#b!^Ebm8 z(8uGe9tGkpBI;>^Mn%9)biw(DL3x%P0%G5Rg`DKkI}OnawbwwwJQ7ifu(!6fY{XlGAAOY%W}c8WudnCp6pqb4d6J)>ZwP3!z#vDvAPT9* zd~tAkp)fmJH#ynJaaLq>tTQ2jn)K>bt&^WVfG5`m@<}@yk6*sBgc?0SJR-&i`8UHW zj7xyleyG}R$XxBVXpKMYn%E$EQ8&#*&H+-;e0oZ01{*6OB_lJ~Z4LqfC={m;4G2K> zL*l&GvU`*v>XTu6i&|akY1B7vxc?M9JG*54)zE9!VoSn#TSCAS%5#8L(f=ci-an(r zdY}K0%wnoj&4lXq?Ti9i)g7MM@)wmL-Ab9J4P&;rbb?!fc>^3CxA}T8&Y{x3ATzUZ zp*;wwgGX6rfp46~))bT{^*Qc2R-A5^Yf2w=U!qG81IRD`#~0{s3<(tz4OAC#iVNGC zN|z1*;EcQ4ucvG#AwJu!#UfiJ*DU8H5iF7}IbWtJpn#w-KI``c5LDAg{iC_x2DO?L z>Y7HhWK3hDv$DFn7SQXlppJ1EZa04Zf#4$`EJ<=&Eu1iJtU7w=)dcM<@-0h;{@%F< z++OzRs5SrqR-Yg2nM1VY;0uJHf7&@{e_D@DvjYI)4F0N>+Z%UCG}Vf0tT3nVbF^f?@7JTix|Je28oNE#Sb?j6&Nj_zsRTC2fTx$V+S%dyqS#!mL$QA!-(!U%RK4|$F=DVf` z=O8vJL^WD=^DpJHci`3ms7uZJ^vQny1O}UkC*z;c89G&3>53eg^|Xi^u#E%0-E&AP zr@x;k@^--6TyXwGy54teB}yhxTjF3eA{V(~2cNRoYQ{u+2RAo=K5K*R0|m4&`->0e z&{aLPmNl-rxq+4+*gCuP*!Ew;>pPUfTm3y?SmTu%vMdEYw$LqZe$IyvbyfybiyJTj zkAP}zz;n^m3c&#ZfKJ24#^$rfLft^=%19MV2l0a4+x4moD;xDxb;DZoam4}*!-(A& zGte*6g9q&bnYYDx$nkopKXf$*fjyWr5O(YrJ33-+{&2ByZFgSr&kPh#99ocI-*mn&4f!3hzez;VB6v=8B^2BQz0C6r`i zxqx;(v#)GCIc_kn!*Vh%O15x(TnOk$KX61%6BY^RzmYh-qN7Eifm#xK@NGU!gXSMr zYb=wbzyIk}I%CSXucl?wNtG%`C4!oT&ma;AHIS#QsPW^3zVU(px9Z6Exl`(%viL^B zsIxuD+2Q;v{Qx(!(zE@|6nEy%dtmkHhCbd4=BcZ9+TtutJJ(gHOhZ%tR$Z|W{~kWo33oF-d*A1{0!+t(ezsdx}-4|`1K79x3Dvg1c zbhY#|r6p?%9nUHGUChmQ$^O!|cD6erxy&UdW~i7oQpxXLxL5Pkr)xv+9{d5uMX?+?j_npIp{tnj@GYtx9G zODAE?VvJpM>ZPm=Dr@w$4xUiGBH8mvb6O&MVU{tpPalYffIMlaaTzVNk#*Y0ykcB$ zAEM8DVgxQ}J3zhy10xhlnE6G^9%1^=4HpApUXLF-;Ft(7_3ek-MTDbT51+^4cZOgE z`QHw|)r|40BsyZ6trZ=)v7IIu$L)-ec5awAx&LtV z7NYn3YM!k{hisL}IbH_-*2$)MS~oXsdP3+jnmD66Oce+~!3&fPve7Bk4rmNOSjdsQ zmbX!9`M<306)Iuy;L1#u&zsm9H(<*9o4#Ve)oDN6^4BE%fZvs~lmOtKIx~vh$EQ?c zhguf-A;$;zZ6As{&t;SGHJjG?AAu|khK$gV87~gNjAFPAHe&nAbQKgjUO1H{AsS1Y zP7WSun-l=`w09(mRn}rLPLQMDw({*YCU$0K%>NorNnV*dGQjdV)AMkjOYRb{RSOPA z+e_&6`?SnTSlBuXf)J&leF*0TVdpSrb&FC{njoIz!2meKb|-ZEd+ss zGCJU3pv=)G899@TF=pWWQEdF@#8Q-7y;|toNbQ!^@cQ%CFw~n-a(dAXKpE(_eg8ri zE2c;xwePEEFoo|5>X;a-_L+yyGh#g7Zv# z5WtEeA3n>^Rc+cYM>q?9-XCbg2-&u=W09hUz6;VSdV1AKw;Ambghlc+PbreQ^w#n0 zZKQF_^SE3y|B_>Jy3#LfUC1(6z!RTm5tC27{KDq7hlXhxL!oCc ztpuGw&QCZ#NuH=RWdmzgBoIKJ{DTKo5JkmY*G8MS#N_ljKSn5ptk$GKxX(AJmHqgo zo{o+Z%-!eQf+X`Vz|=o`EnESC+Kk@g-2Lhb;grnJhlBcr6Nv$x(@@`qlQ47`IQ&?T ztfwDuIKM$S4+#!p4p)|rKsVhmWi&kFcgIRchhwa~(d4!EV3!bhDmvJtwOTT?AkQVr z>!jXW!Zbh#XSekIYm3Ex7GKk{W2CH8#bC?!Ewr+PUk_r&8|6J1Ux1v4y(_KXB3@k; zmND`ECgQqoN-teY+}Zwh5(hMNWY}}`ysw|G-Z9BGCM}ke^I_b=I?D~^zs%l`qMNwi zTR#3;Yh%!{ps8E_GQWJYVynKssKw08d+NQ7*5kjcqLra=_J_%z9T2!K_PF%^*MF4; z$__moikk~S%y}-D*e(PN&PhV&*iTnNDPD}&s604{SNL|gTcl~EHvw%HvfTd$xzEc> z)`-x61=Ax;-62mA!y)O+Ewek)G-*CG9IELdHdFKON@f>G8B|)wOImj2r}dSJey(@c zl_j#_(*vI@CWO(~>a}knt;Wp%8;7dN*ls!vz0KfJXy z(A9}nD;GN(!@HGT*_%xKJII?QSK8=KBzyr)7ePI7qQq6Pi1vNT z^_3Fl{!dud2igYI&kjD{im&O+Z`loPzAgUUFgVdl{un9uWG*p6XDVSihoA1jacf%! zYSQ9}zE+e49U^D%HlQ$b>CMk=J)N=_C>JAEiI8xac>VErt!q1ePZqueEiWyYJ?6#i z9sLMtl2iZ}+E#Y<>o!-XN~w}88a%%51!#i;>ZqV#hp%Ka##20RjFa%6>ZwKc_aCXq zQU>@M&CA5jHupNLG-TKS({69?Ox5RR%Ber!A~9SezDE;*NVm8L^gH*t%WjZqNb5A# ztx|+|ROSxRSOiv^{l#+3TbB0|YY?o&%a`=DubWCo<1=@nxo4B#Nm@&|LLQu#@O_f7 z0RHkbb=i}^m>6+|(~Tjw2p6|Ag%5qHT&@j!Of0W&h|WX92#*8Z_cpYN)hX$!JLZ41 z0LRWT!a+4+h*v7FZ^->#rF~cRL3L;RbM^cr#-~BSSTVOdRRXxYBfVwpKnrbzhOAPy zjrDsqH`fi_t~;J<5qIrU+0u*@3#m=|j z>Mcy6tAbxQA_qdyFV^a4-|OMZXlRP`Zby#miX0hPFj;*ClLSM%Un zZ@(t<7c)i(a8lZsjgF4KqZIBF(O>YeLv-;>blqpp2O-^t_93gRGqP4oxvMUVxcFR1 z+Qfd&3GK10^T)EDYeC=`DuBZ|&>zJ7~BX>6f%#o^@t!$A*}^ep{lCtopeBDN2-6s zrLUMW*RurX-WpQHPWd;>N9VT#QW4mz4}QhSz37^qXq#N7#L`5G?d52H4Ro?W`A}MR z7Y6P$;2htyuTm-@%`EpruY~L}@WG?Yx^L!{@l)4L@U|iMujHm-wF}Ct4}s0_%$u_C z%@{6NG0r5mc9$hE;2J^QH{^MqUXwwQq|KW&T)p*ZUv4B?+0+ zzo@GRm>yv2ZoOD2vT2$uXz}q`v^a6~jT_+p&F%4{*zUc8x?V(nt>2G3D3y*)yZ51m zR@FVc;Ik)>T~wZ>l?6}V=a4n0I$U(OD?N0F=X4!cmz;mV=79cPg=@T9HR0}fRekqy z!r}q`67`@u3|HeK7oO9{_GGllfB6e+{A%9pJs+y+j%d9j)|D@98A#w7NVwDF0{WhR z%^PQtGG_@Ev!s11>DhswJof!y0_(dq5}swX<<}2RyXljC@D{!;$-*sgxu%Sk=tElc z6)Q7gXZ^kh8f|^tK;^lSHTKFFf9g5Z*?qJ9%Y&a$h-ep&?_${)UUd(nk}6 zWe};~_MzXhLk^eDeBBY~+DAFs&!0Mys;5hmkX*+GQYPVhQC#D@HnEq91X5CVHpik? zc2)R0(Y14P^;=CuFPVL|ou)2p){T`=OIq6)tgw$bDP$ zy2sw`^J?R-`|tZsVYALZVM~7#J?pG0XzCnx^Rc?4TNNBOnc3OJV-oUaGPhfqE+tubJP@LTHEMhozoejmFFFgTtQ`6I^L2__{ROTB zQlmJI<$WDmTz#{qC4=+4+%&VC^xCW`v`1msQ8=3Ys)4D`RUdp6{lGvdteJfE^qZ(8 zJxAOfZr5+upFe;8DOLDt9-k4_e*H1GY`lwi72d>N>2VsF6QAl!5mhdG*#e3i{ILChuaaxj;-4^xkO>~*VK?KeteFOIp2br89HIzPW+ z)%N0BE{493C#57z?)rMQpf!6zxu2=nGTUl2`?IyDY8eP8yYNe4g~sIv%a@-N+PsU3 zUkRzS+!?vRo$5Mbm3Hi8hdUGg=Cdd@^zuWtzz@alos==F9jmXG$o1WZy`_w&;LeY} zDZgUBz^(pZDdnQ1s?TBu=H8bd9!fEckI&96_O?yYzN4yQ1ns3-Lk*u=eWvnTVc(;s(Rd$8wRmv_;-lIeA9 zWo%I({CEf2_?TDLYd!klxzy_Fwx84|F&kT)*!U!2J5=D9zdMz=DH<7xvnO9p8Tcq( zse$~u`3&rh_}$qj3JR=u#qSVB$H%WT4_fWOe(~_}T_6fPKBE03;IEj61Hz-{P^VqL z?IjlbYGZpLI@6|ok4F3&jWuSL`5PIs%0UNe26J{+&EU1_%)Ug##lFEh(Sn$* zt^Moyca~E?FKHPVP*|XX!D;?it_IIzWI5^M(wPkLzMXz>=PG2A4aSa5X}RHi>n}$$5IvAJ z5_C$)`E9?D?pe=zmG1r$9@=WS!KFIJBdEygxV~* zRcpU$pTHp;D@xC-EJ~tpFmqCzGIJy?d7Z@NEki|bWm3Hhw};D$Jh&!Dw5sNM?ZN$q z3C>SGKGdoWW0W&f52O_D+%Id9P%I=yNE~-x$Er`BtQfc)e9vH_J zRif$v8|2N9hjVC!#vqt@dvluCA(grnKrLNA-`3312}*qWW!i5v`CZ5;tp%1Yt0!J_q+_J z$Vfc1eEhyuy-1sy<701tmnzth!#(;&t&kLQO`kMy)a5c_x~43!GO%X?qowr;n_irW zxLEWoxmmD&hS9|wRZQ(qWKNwIGsmk3m2?F5mK$ygmsmLNjr|myX$r2Az&=fOZ=Ulz z*|!%X@%qv?wtJABMtiY4JGW=?GOW!zT6pS3@`>drv|IgmkizIYOK=(GIP4ap{i4A` zQ;6RvF{s4q+MD9Qv!3Kx&oJqi1m~hq3yBFAl&EXLcUz;cW-3+gYF)DSbe=a)R~EcA z+94~VNV}WfBc_guZi9W~h03v1&Z{H48fp3!>_)j^SsC1IT@#7Ex1xgAE(O$o1jABP zBQD`^{7=#n?-%1y+S&2b1*5JknF_iQ5@iV|)MleN6J@aq#+?R{5|Z(vOBGT)++aKD zZD9!TZ?DsQ;WC%ICm9ENB6gcPHPvgp;^p;{eIhXr^N8F626Y-rc1ghr!V2NWg)^;%HYL7!=dilU-0JgEpE4V z*Hhuv9RBBAF;s#Tm>GA9S@j&!cvQ{# zI<0+#UlhzG%kt~jL^OC=X=xCnf_zwXAlu;mi&l#f56jSHn4BBO)`kxWEiGRJc;H6Im@ zFVJyyu8_hl<5a?BzmZOTJ;&m_d7efcci8s8+8j7XP0#2VSh3rMUZ6^df)N#jQQ(!+ zzaa!Pw^h%r!Eh$11lXh1pfn{*{z^b8ki3;Dc4oJ2b$)7v+5i_1oV4AmZz&64mC({;wl@2DXf|^;P9u80%Hy$j zHl*h@bms9l8~W67Z}uC%J!WyqJ2hRC=(j)G$I^r?xj+7CMRTYxm|n7|d*Y&9GTCsl zsC{`yTW5C0pb7#Fi)@q{?!0%yRi$+;=NXuI6r`TK{@k{hU} zj=n>~F+XF7hUMwaOopXL@gBHm0LNkHpd^&&1^nV80!HrFLeXm(9919 zok+N1nB`Crn>{ji-(N7B=ufPgRaxpKl}EJ#06G;e)2f%(a|ftYuqZcbn}v^2=Wu|> zW#`x7kbFV;Ru9K#9!iS}3quD$@5-8nLDS(&0=nATuoF&HW{jN!AAUDQ5_$&u!#_LU z%mA=q!$z03Hv*q7E_CbR{kWC}2px6x@BqJ$hvjXYF|)obZ{NFn%^D$Uh8A(zCsVk$ zY6hZ~kXnV}*0&l(K3_b&$2QfAAc*|H>0E4J>U4d0*&b2R>{H0^9W|E}xYf;!r8+V9IS3QAu{8AoD?BT$t&NJTdK z_PRhD&gyqdO!!wuBvPfMmAL(M*b*slLSL*hj+@ofDdp|g&QJ3@c0V7H2-nT`MYv>Zu^sM?t7f&dAPOuvqk-<9C}fyiaPK!A z)Zcxb)&{SIDsm)Q%uNjm+V`3JoF27TuHpLqoENIDSUY?2iDsydv1-qX0tB{n*11Va zGLBQy-2wkhSY-tIK=H5`(3zN;T;9&pHJ#Pg1zrxl;%EZBBH@%a{s?UL^CE1&84_#o z{B?GC-sa}avte)PE!-A z3n@ELkM}~RXNJq;I$RFIRk@%*!}xmS$9z1c%}IowO-pU8@q8$7PQG> zwgv$x&e8MOe%)|TkGql~;@Hi~JVIXc0sCv)ic<|#Qrbh1zpaYK#NnQTXJZf=qU`uL zWNjLmBP@vGe=OeEwezZBzb8@f?LK0%l9lMq1mPa(EY0gkpw4R>RV?$ z#4P(=Ol@ZC>y2TXFuU@L0o^Jzj*FGjDd%MN$AL^fIwpz9! z0DK?P?|5wHc3rWx{XJ`^VY#2N6hPhbnsM=cd=xctN)| zJv;>)OzMwuH4&$os51F}igJM3?eo zN5NVDY95Bl!(f7-B`>m#R{bauQt027(q0Fr9mm;dT)j%MkzvPqX=XBo(<7vSs(yWJ zWd*VcVjA%Z(qb^NMri1ih?cPia{XLnC1I6Un%|9YN#(lJ{mJ0Ri^Fk`wJT;ws;abW z&Rd5%(`^NpqcMpktZSS<(D7zJKiY48_h>%XM`-gNr`0^OzG1B*xU;y?KZEW+iR3w4 z4F{2m+e;3^avP4qHXAmRMQBba?>8-0oEQ&41R5d8z7VWvXkco;a|D%0<+LS-_&xjW z{&E45U#M_q*kg-YQAs<{sQ<$2cmybeSS37)j#$yvk zUGRGqsei*Uk5l;9$$v|QDKO#x zYw=3|54R-0A^5+wT=P9k0T3`Qk5>PuHiyQuRlL`->Tld&*!w3G%0q`9EfG}zgxpp> zc#oQLGtj@JOlHEMlQwbWHn6MEvp>8-X7~>%2+k?kv9bEnGC^pW|J@hL7XkPK9|Iaw z%D-X#WQ_ke)Bp28Tz!oH%PlH4pW!6EWr9Hmm>+Vc3`cC#qX}G{l102wt2Ce&g6)-K zLBhHC{NExwZHZ}UqAq9jq~&(Vu^+SvJH-t`w68oIFQB8$o3Ug`KLO!19p=TkJFW!o zXFbdX?ytbF1_okN;{swCLU{Ck46a)xd`&_E5h_2(Uu$oXr@-s+nuv$h>Jh>R09lzdA8jEA??~uBxB`X1@d^?WAEqBC48WA4^fpe2 z>BR9L8t)s}|IH*<9~CwMW17T@R+_l$B4^X!y?y(Bfe~gjWhm32^kNH7R1VdHNRCN# zrhS85=^uaIh4<1WZff$*f}$@9E2kMoT#-34Z%E_d=&LDF9k3JR{JbD$b1xqz`0HD8 zWJ3Sk=*q)()ULXB0u*&^C{Q@$P$*4}=_i9Toa*O%1=VMpJI;LHPg?rew|9>w(M}@q zO4Z8NgMOV+8Ir?~<4}$!TY%x5LY3><4HkGSOcZxZO6cFM9LxevLWZkO^f;AYqJV+& zS(a8fzh3(t&2b@%O@USChHK8U>Ot0NQ{v%kd+bMRALAU&x_HyiNX~5meHjoG80pEv zn}m3X%aBeWfKY@VE{~}y*;tF|tPtWfwk7{WHAo}hf5<}4K@*?Nz82oE;G8DrgRk_$ zis~%~^m217MuB^kpSW|=u4|$pe3WIPux9e$#2{Kac#$z(hvN2z)sL|JP>9NyKgeJ9kf_%ENT5C)beV+Zvm7FJD~ zXC8rlezfMICgQ+y6P~@jS#dDfqDZ?G>0#m|8I<$ACPxA6@B7W|({) z$rBZx{?f!`3IY6QU!C7j;?_@T2M;D!hN`ztwtpjc@1(Xm6i< z2R{RKXzE6%T2FV@!Q|w*$!o@$7|bS()bbgTK=XXHh29QgcFomvX)4lbqG%Yni)g`8 zOGWnP{zs2q5BG-Hq~k;beFtT$gL8L)NF{i0$dIWYQF`%7TnKwus^tlXTCoX*)G zz&>JLIV(kH2CW_<`&H5T07u_w1b#pCAW9v`ieUwd3sa|XS*Xt&;v`K6FUJ?z=3FR%6T`+_e>O_L1^M@o@TjPyM)59ywPtORT1Cyc zpH=O+jIOxQv5Ml1v5B#j^0Cw$CTMrVh2KMR@jAQ9kC- z!k&L#9Cwfd%XUu|J6cI5O}L4V&hec)**O_**RoR=?8IE(hsj*aD?y(PKbK#!WVB<| zwkP8{5FW{@Y5HbjRMH4GF&2jXMKbXRN#0k*dl^tILf!MZNyJW(~v+FdyAp#BkeEETk*MD%OD27I#wQ|#ZSg+KWgtYFM=X$ zG*Ghs;HS6wU)NPm{xtYF)La^ZKm`RTY6v9tllSfQD4?taR@4?BmOtB5T;an4#P09h z4G=LvB=tYWg~htC0u@8EV_8RgwLe|-H&68KxuC`A$QiV*!Ra#egDF6!4sXll0>>v< z`y$X!rul?K5jN`1aq2O2ZO3NJ1B&vVKj5zG@D(TV?W5_rYAcJIbBybk3o+E>-)iFSld|q0n zSINW!NIMnq3$%OwTXPZTf{}xokJg?jywq_@>t7y2i3B9>t=k*|sHvjY;RFctIoiS# zLKI%N<{T*bZt$l4o$Sy;dwo@tUEu9+&8^(F#$1MHaD8i}(RMslhX2vnmd$(q<$|U= zz|jxB%9w?aw;2y?vW6!qq{~To`@)3*OBPv}?`==N4L_)#6yai|C&&1s_p|s3**mh} zgfL_u^-5U7UP6C%5y=1Re83b<-+7%^s?vL!Ua8An@`{gFz!_Hd{#M6~j1o73L36>s zOLR`vvZ}-!s_KxZXjO~&xc2r`x-^pS=_P-5d4@GQye;rF>kd7^e)%xG2|iBpT|~-s zCc##fpy#z@KPVT?WC*IvdBD$|Fnc!TavE!`$Fe?SvRkNKc?YK&O~GiA7d7O+3{1TU zrzxQgj*riWEJ4f{;_E)>%x;^0c#X%T8Dc2W3?2JHLk(Ezm@+bK#T8j6$3?#Om5JH0GXV^F6I)o-p`;-*LgzF(#vU4QArSeDw7hrP;@WOdulWuE}GF zx}B-zMFzo(pO4-yGsC|S++Sfjr{hHWUGfkeIUP<+bRJLEqi2eg*caIOW#nxd3Mfx8 z7DBB%oWN*&(LX-X^P@g7sFR9K3#*7_c*;tIPAN_lwcxFObBYxM{gvf(LYu9m&~xZs zUwZ+@5@&u)#nCTQGU8ub2&~L)8x__~OR;J`)%g*s>!EJL(OEy){1=}F)G_?W4#&Q|aF< zZD*=kmdF4};qTLKwGEq&3qEf|g-yUkqsIrEIoqN3$Q5+2*ICH99ol2$=OcLrk9-Tv zHV~jUhxZ-ol~x?|g?!iPe1En^R%MB_8oNAd^q!xdWH_)S3)CZU??2=1Aai=A3%T^M znW=iRdG3!tX0f1Q;)?(T!j~uQ5)hclebixNbWrUo^=NakUa$+v%So6k*eFP-M~S_NHM(3q7oyCm@dg=6I*0d$v3 zZqCQ9HpCP}sjo~=1Y`0kQKLr!w>hG%gfeDyr~Q2X!z+Jtb^!o!aamyl*$F6SbhqlS znuXNge91xX6wAjvl@k+v66%5t)mk+(+1BAgmwU757H&bBZ zihfvw53KD}BHe@=`UbB2;DMNN$RYn2t2C6cPif*;_nM7aLZOLD386yBPlxeZTfW^7 zlt>eS>sDC6sc_`z4>}&G*p-D_IxH>-$g7}Moe+^m)ZU%d9Nb%671H? zf&n<;+O)Pxt{Qki!8m|blTr?uJ^~n?`2UH9{_jln0h9luL3{3zCQ+}6e$}QsK2+W+ M$f!t{y)+H@FOllmG5`Po literal 0 HcmV?d00001 diff --git a/images/github_edit.png b/images/github_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..619e483e1358d118d50d7d4bd4d0bc9061e44cb9 GIT binary patch literal 19447 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 literal 0 HcmV?d00001 diff --git a/images/github_pull_request.png b/images/github_pull_request.png new file mode 100644 index 0000000000000000000000000000000000000000..13e2eb5fc941c7fc18901782f93aba7dc921dc93 GIT binary patch literal 14374 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 literal 0 HcmV?d00001 diff --git a/packaging_apps_git.md b/packaging_apps_git.md new file mode 100644 index 00000000..ede9b6f9 --- /dev/null +++ b/packaging_apps_git.md @@ -0,0 +1,85 @@ +# How to use git to package apps + +Git... Our dear beloved Git, which can be described also as "Goddamn Idiotic Truckload of sh*t", according to Linus. +Be sure if you don't know git yet that you will soon agree with that description. + +YunoHost and all our apps are on the git forge GitHub. Which means that if you want to work on an app, sooner or later you're going to have to deal with git. +So let's see how to work with git to be able to contribute in the context of YunoHost. + +### Working with GitHub + +Let's go first for the easy part, GitHub comes with an "easy" web interface to deal with. + +*First things first, unfortunately there's no way around, you need an account on GitHub.* + +#### Branches + +Then, probably one of the most important thing, **do not work directly on the master branch**. +Sorry, it has to be said ! + +Branches are, as GitHub explains, *"a parallel version of a repository. It is contained within the repository, but does not affect the other branches. Allowing you to work freely without disrupting the "live" version."* + +The master branch is the branch that contains the version of the app users will actually install and use. +The usual thing to do is to work from the testing branch, and when everything is settled and tested, you can merge the testing branch in master, so users will enjoy the new release of your package. + +To see and change the current branch, use this button: + + +#### Edit a file + +Now that you're on the right branch, let's see how to edit a file on GitHub. + +You can edit any file by using the small pencil icon: + + +If you don't have the permission to write on the repository, you will see (as on the picture) that you're going to create a fork (we'll see below what a fork is). +If you have the permission to write, you will just edit the file, without forking. + +#### Commit your changes + +When you're done with your modification on the file, you can commit your changes. +Behind that word, the idea is quite simple, you're just going to save your changes... + + + +The first field is the name of your commit, a very short sentence to explain why you did this modification. +The second field is a large one for a more complete explanation, if you need it. + +Finally, if you're editing a repository on which you have permission to write, you can either commit directly to the current branch or create a new branch. +It's usually better to create a new branch, that way you keep your modification on a *parallel* version of the repository. Your modifications will be discussed in a pull request (explained below) then finally merged into the original branch. + +#### To fork or not to fork + +A fork is a copy of a repository into your own account. +We've seen before that if you don't have permission to write into a repository, editing a file will automatically create a fork. +Because the fork is on your account, you always have the permission to write on it. +But even if a fork is not the real repository, but just a copy, a fork is always link to its parent. We'll see later that to create a fork is really useful when opening a pull request. + +When you create a new package, it's common to use the [example app](https://github.com/YunoHost/example_ynh) as a base. +But, because you don't want to keep that link to the example app, you should not fork the example app. You will rather clone the app. +Unfortunately, to clone an app is a little bit trickier on GitHub. We will see later how to clone from a local repository instead. + +We've seen how to edit a file, and how this could fork the app. +But, when you want to edit multiple files, the GitHub interface isn't really the best way. In such situation, you would rather clone the repository and work on a local repository. +You may still need to fork on your own account to be able to save your modifications if you don't have the permission on the distant repository. + +#### Pull request + +After you have committed your changes, whether on a branch or a fork, you want to propose your modifications to be integrated into the main repository, or the original branch. +To do so, you're going to *create a pull request*. GitHub usually ask you directly if you want to do so. +Otherwise, you'll find the button to open a pull request just here: + + +When creating a pull request from a fork, to ease the work of the reviewers, **do never** uncheck the checkbox *Allow edits from maintainers*. That option simply allow the maintainers of the original repository to edit directly your work. + +#### YunoHost-Apps organization + +Following the [YEP 1.7](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines.md#yep-17), your app has to be into the YunoHost-Apps organization, but if you never contribute to an app before or never had any app into this organization you may not have the permission. + +First, you need the permission to write into the organization, to do so, ask to the Apps group on the Apps xmpp room. + +To transfer your app to the YunoHost-Apps organization, go to your repository and to *Settings* tab. +At the bottom of the page, you will find *Transfer ownership*. +Into the field *New owner’s GitHub username or organization name*, type *YunoHost-Apps*. +Your repo will be moved to the organization, you don't have to remove the original repository. + From 0628f0731ec1eef7d59c6d84b1e8769e78417551 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Tue, 31 Mar 2020 20:32:16 +0200 Subject: [PATCH 02/10] Corrections --- packaging_apps_git.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packaging_apps_git.md b/packaging_apps_git.md index ede9b6f9..bdf30481 100644 --- a/packaging_apps_git.md +++ b/packaging_apps_git.md @@ -14,7 +14,7 @@ Let's go first for the easy part, GitHub comes with an "easy" web interface to d #### Branches -Then, probably one of the most important thing, **do not work directly on the master branch**. +Then, probably one of the most important thing, **do not work directly on the master branch**. Sorry, it has to be said ! Branches are, as GitHub explains, *"a parallel version of a repository. It is contained within the repository, but does not affect the other branches. Allowing you to work freely without disrupting the "live" version."* @@ -46,18 +46,18 @@ The first field is the name of your commit, a very short sentence to explain why The second field is a large one for a more complete explanation, if you need it. Finally, if you're editing a repository on which you have permission to write, you can either commit directly to the current branch or create a new branch. -It's usually better to create a new branch, that way you keep your modification on a *parallel* version of the repository. Your modifications will be discussed in a pull request (explained below) then finally merged into the original branch. +It's usually better to create a new branch, that way you keep your modifications on a *parallel* version of the repository. Your modifications will be discussed in a pull request (explained below) then finally merged into the original branch. #### To fork or not to fork A fork is a copy of a repository into your own account. We've seen before that if you don't have permission to write into a repository, editing a file will automatically create a fork. Because the fork is on your account, you always have the permission to write on it. -But even if a fork is not the real repository, but just a copy, a fork is always link to its parent. We'll see later that to create a fork is really useful when opening a pull request. +But even if a fork is not the real repository, but just a copy, a fork is always linked to its parent. We'll see later that to create a fork is really useful when opening a pull request. When you create a new package, it's common to use the [example app](https://github.com/YunoHost/example_ynh) as a base. But, because you don't want to keep that link to the example app, you should not fork the example app. You will rather clone the app. -Unfortunately, to clone an app is a little bit trickier on GitHub. We will see later how to clone from a local repository instead. +Unfortunately, to clone an app is a little bit trickier on GitHub. We will see later how to clone to a local repository instead. We've seen how to edit a file, and how this could fork the app. But, when you want to edit multiple files, the GitHub interface isn't really the best way. In such situation, you would rather clone the repository and work on a local repository. @@ -67,19 +67,19 @@ You may still need to fork on your own account to be able to save your modificat After you have committed your changes, whether on a branch or a fork, you want to propose your modifications to be integrated into the main repository, or the original branch. To do so, you're going to *create a pull request*. GitHub usually ask you directly if you want to do so. -Otherwise, you'll find the button to open a pull request just here: +Otherwise, you'll find the button to create a pull request just here: When creating a pull request from a fork, to ease the work of the reviewers, **do never** uncheck the checkbox *Allow edits from maintainers*. That option simply allow the maintainers of the original repository to edit directly your work. #### YunoHost-Apps organization -Following the [YEP 1.7](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines.md#yep-17), your app has to be into the YunoHost-Apps organization, but if you never contribute to an app before or never had any app into this organization you may not have the permission. +Following the [YEP 1.7](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines.md#yep-17), your app has to be into the YunoHost-Apps organization, but if you have never contributed to an app before or never had any app into this organization you may not have the permission. First, you need the permission to write into the organization, to do so, ask to the Apps group on the Apps xmpp room. To transfer your app to the YunoHost-Apps organization, go to your repository and to *Settings* tab. At the bottom of the page, you will find *Transfer ownership*. Into the field *New owner’s GitHub username or organization name*, type *YunoHost-Apps*. -Your repo will be moved to the organization, you don't have to remove the original repository. +Your repo will be moved into the organization, you don't have to remove the original repository. From f9039620a360bc94b184f5a43fb4347f8e918977 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Thu, 2 Apr 2020 20:52:02 +0200 Subject: [PATCH 03/10] Add local git commands --- images/github_create_new_repo.png | Bin 0 -> 54060 bytes packaging_apps_git.md | 131 ++++++++++++++++++++++++++++-- 2 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 images/github_create_new_repo.png diff --git a/images/github_create_new_repo.png b/images/github_create_new_repo.png new file mode 100644 index 0000000000000000000000000000000000000000..b96969a1d08325f8b4db5e91bc1c5f1a9f0749dc GIT binary patch literal 54060 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 DXn1_l literal 0 HcmV?d00001 diff --git a/packaging_apps_git.md b/packaging_apps_git.md index bdf30481..ed2b9066 100644 --- a/packaging_apps_git.md +++ b/packaging_apps_git.md @@ -6,7 +6,7 @@ Be sure if you don't know git yet that you will soon agree with that description YunoHost and all our apps are on the git forge GitHub. Which means that if you want to work on an app, sooner or later you're going to have to deal with git. So let's see how to work with git to be able to contribute in the context of YunoHost. -### Working with GitHub +## Working with GitHub Let's go first for the easy part, GitHub comes with an "easy" web interface to deal with. @@ -17,19 +17,19 @@ Let's go first for the easy part, GitHub comes with an "easy" web interface to d Then, probably one of the most important thing, **do not work directly on the master branch**. Sorry, it has to be said ! -Branches are, as GitHub explains, *"a parallel version of a repository. It is contained within the repository, but does not affect the other branches. Allowing you to work freely without disrupting the "live" version."* +Branches are, as GitHub explains, "*a parallel version of a repository. It is contained within the repository, but does not affect the other branches. Allowing you to work freely without disrupting the "live" version.*" The master branch is the branch that contains the version of the app users will actually install and use. The usual thing to do is to work from the testing branch, and when everything is settled and tested, you can merge the testing branch in master, so users will enjoy the new release of your package. -To see and change the current branch, use this button: +To see and change the current branch, use this button: #### Edit a file Now that you're on the right branch, let's see how to edit a file on GitHub. -You can edit any file by using the small pencil icon: +You can edit any file by using the small pencil icon: If you don't have the permission to write on the repository, you will see (as on the picture) that you're going to create a fork (we'll see below what a fork is). @@ -51,7 +51,7 @@ It's usually better to create a new branch, that way you keep your modifications #### To fork or not to fork A fork is a copy of a repository into your own account. -We've seen before that if you don't have permission to write into a repository, editing a file will automatically create a fork. +We have seen before that if you don't have permission to write into a repository, editing a file will automatically create a fork. Because the fork is on your account, you always have the permission to write on it. But even if a fork is not the real repository, but just a copy, a fork is always linked to its parent. We'll see later that to create a fork is really useful when opening a pull request. @@ -59,7 +59,7 @@ When you create a new package, it's common to use the [example app](https://gith But, because you don't want to keep that link to the example app, you should not fork the example app. You will rather clone the app. Unfortunately, to clone an app is a little bit trickier on GitHub. We will see later how to clone to a local repository instead. -We've seen how to edit a file, and how this could fork the app. +We have seen how to edit a file, and how this could fork the app. But, when you want to edit multiple files, the GitHub interface isn't really the best way. In such situation, you would rather clone the repository and work on a local repository. You may still need to fork on your own account to be able to save your modifications if you don't have the permission on the distant repository. @@ -67,7 +67,7 @@ You may still need to fork on your own account to be able to save your modificat After you have committed your changes, whether on a branch or a fork, you want to propose your modifications to be integrated into the main repository, or the original branch. To do so, you're going to *create a pull request*. GitHub usually ask you directly if you want to do so. -Otherwise, you'll find the button to create a pull request just here: +Otherwise, you'll find the button to create a pull request just here: When creating a pull request from a fork, to ease the work of the reviewers, **do never** uncheck the checkbox *Allow edits from maintainers*. That option simply allow the maintainers of the original repository to edit directly your work. @@ -83,3 +83,120 @@ At the bottom of the page, you will find *Transfer ownership*. Into the field *New owner’s GitHub username or organization name*, type *YunoHost-Apps*. Your repo will be moved into the organization, you don't have to remove the original repository. + +## Working with Git locally + +As we have seen, you can do a lot of things directly on GitHub. +But when you need to edit multiple files, or when you need to work on your code on your own, it's better to work directly on your computer. + +Before going to the hellish part of git, let's see 2 different ways to start working with git. + +#### First case: Creating a new package + +You have shockingly discovered that the wonderful app you love to use everyday does not yet have its YunoHost package. And because you're nice, you decided to create yourself the package, so everyone will enjoy that app the way you do. +What a good idea ! + +The best is to start from the [example app](https://github.com/YunoHost/example_ynh). But as we have explained before, you don't want to fork, because if you do so, you're going to keep that link to the example app and it's really annoying. +So, you're going to do it differently. You're going to clone ! + +##### git clone + +To clone, you're going to do: +``` +git clone https://github.com/YunoHost/example_ynh +``` +`git clone` will download a copy of the repository. You will have the complete repository, with its branches, commits, and everything (into that apparently little `.git` directory). + +To git clone is usually the starting point of any local work with git. + +*A side note though, if you expect to send your modifications back to the distant repository on GitHub, be sure to have the permission to write on this repository. Otherwise, fork before and clone your fork, on which you do have the permission.* + +##### My brand new package, continued + +In the context of a new package, you will also need to create a repository on GitHub to nest your package. +Which is as simple as a big green *New* button. +Don't bother with README, .gitignore or license. Just create the repository itself. +you can now git clone that new repository. + + +You now have 2 repositories cloned on your computer. +Copy all the files from the example_ynh app, **except the .git directory** (You just want the files themselves) to your new package. + +*If you want, you can remove the example_ynh app. We don't need it anymore.* + +You're ready to work on your new package ! + +#### Second case: Working locally on a repository + +You already have a repository, but what you want is just to work locally, so you can modify multiple files. +Simply clone the repository, the .git directory is the link to the distant repository. Nothing else to do than a `git clone`. + +#### Branches + +You do have your local copy of the repository, but because you have read carefully this documentation until then, you know that you should be sure to be on the testing branch before starting to work. + +To see the branches, and to know on which you actually are, while into the directory of your repository, type `git branch`. +The current branch is highlighted and preceded by a `*`. + +#### git checkout + +If it appears that you're not on the branch you wanted to be, or you're actually on master (which is bad !), you can move to another branch with `git checkout` +``` +git checkout testing +``` +*Read carefully what git says when you validate a command, do never forget that git is sneaky...* + +#### Git pull before anything else + +You're finally on the right branch, and ready to work. +**Wait ! A nasty trap is waiting for you...** +Before ending up in an inextricable situation. Start with a `git pull` to update your branch to the latest change from the distant repository. + +*Sometimes, you will encounter an impossible situation where git is saying that you can't pull because you have local changes. But you don't care of those local modifications, you just want to get the last version of the distant branch. But git don't care about what YOU want...* +*I have to admit that my only solution is as highly efficient as dirty... A good old `rm -r` of the repository and a `git clone`* + +#### Let's work + +Eventually, you can work on your code. +When you are finally ok with what you have done, it's time to validate your work. + +The first step is to inform git about which file(s) to validate. To do so, we'll use `git add` +``` +git add my_file +git add my_other_file and_also_this_one +``` +If you want to validate all your work, you can also simply do +``` +git add --all +``` + +To check the current status of your validation, you can use `git status`. It will show you which files will be included into your commit, and which files are modified, but not yet included. +`git status -v` will show also which part of the files are modified. A good way to be sure that you didn't make a mistake before committing. + +#### git checkout -b + +Before committing, or after, or before starting to work. Whenever you feel like it ! +You should consider adding your work to a separate branch, that way, it will be easy to create a pull request to merge into the testing branch and discuss with the other packagers what you suggest to change. + +To create a new branch and move to this branch, you can use `git checkout -b my_new_branch`. + +#### Commit + +To commit is simply to validate your work in git. As you can do in GitHub. +To have the same fields that you had on GitHub, with the name of the commit, and a longer explanation. You can simply use `git commit`. +The first line, before the comments, is for the name of the commit. +After all the comments, you can add an explanation if you want to. + +If you want to commit with only a name for your commit, you can use a simple command: +``` +git commit -m "My commit name" +``` + +#### Push to the distant repository + +Your changes are validated, but only on your local clone of the repository. Now, you have to send those modifications back to the distant repository on GitHub. +In order to do that, you need to know what is your current branch. (If you don't know, `git branch` will give you that info). +Then you can git push +``` +git push -u origin BRANCH_NAME +``` From a7748996764fad24341abe903a157d374b62077d Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Fri, 3 Apr 2020 19:01:44 +0200 Subject: [PATCH 04/10] French translation --- contributordoc.md | 1 + contributordoc_fr.md | 1 + packaging_apps.md | 2 +- packaging_apps_fr.md | 2 +- packaging_apps_git.md | 23 +++-- packaging_apps_git_fr.md | 200 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 215 insertions(+), 14 deletions(-) create mode 100644 packaging_apps_git_fr.md diff --git a/contributordoc.md b/contributordoc.md index 31bc784e..4570723d 100644 --- a/contributordoc.md +++ b/contributordoc.md @@ -7,6 +7,7 @@ * [Apps wishlist](/apps_wishlist) * [General introduction to app packaging](/packaging_apps_start) * [Technical introduction to app packaging](/packaging_apps) + * [How to use Git to package apps](/packaging_apps_git) * [Setting up a dev environment with VirtualBox](/packaging_apps_virtualbox) * [Manifest](packaging_apps_manifest) * [Scripts](packaging_apps_scripts) diff --git a/contributordoc_fr.md b/contributordoc_fr.md index 57ad494d..4c932803 100644 --- a/contributordoc_fr.md +++ b/contributordoc_fr.md @@ -7,6 +7,7 @@ * [Liste d'apps souhaitées par la communauté](/apps_wishlist) * [Introduction générale au packaging d'apps](/packaging_apps_start) * [Introduction technique au packaging d'apps](/packaging_apps) + * [Comment utiliser Git pour packager les applications](/packaging_apps_git) * [Déployer un environnement de développement avec VirtualBox](/packaging_apps_virtualbox) * [Manifest](/packaging_apps_manifest) * [Scripts](/packaging_apps_scripts) diff --git a/packaging_apps.md b/packaging_apps.md index 5da09827..bf2c2601 100644 --- a/packaging_apps.md +++ b/packaging_apps.md @@ -5,7 +5,7 @@ The purpose of this document is to teach you how to package an application for Y ### Requirements To package an application, here are the requirements: * An account on a git server (e.g. [GitHub](https://github.com/)) to publish the application; -* Basic knowledge of `git`, bash shell and other programming stuff; +* Basic knowledge of [git](/packaging_apps_git), bash shell and other programming stuff; * A testing [virtual machine or a distant server](/install), or a development environement, [ynh-dev](https://github.com/yunohost/ynh-dev) or [VirtualBox](/packaging_apps_virtualbox), to package and test the package. ### Content diff --git a/packaging_apps_fr.md b/packaging_apps_fr.md index df480230..a0c1f114 100644 --- a/packaging_apps_fr.md +++ b/packaging_apps_fr.md @@ -5,7 +5,7 @@ Ce document a pour but de vous apprendre à packager une application pour YunoHo ### Prérequis Pour packager une application, voici les prérequis : * Un compte sur un serveur git comme [GitHub](https://github.com/) pour pouvoir ensuite publier l’application ; -* Maîtriser un minimum `git`, le Shell et d’autres notions de programmation ; +* Maîtriser un minimum [git](/packaging_apps_git), le Shell et d’autres notions de programmation ; * Une [machine virtuelle ou sur un serveur distant](/install) ou un environnement de développement, [ynh-dev](https://github.com/yunohost/ynh-dev) ou [VirtualBox](/packaging_apps_virtualbox), pour packager et tester son paquet. diff --git a/packaging_apps_git.md b/packaging_apps_git.md index ed2b9066..7fd2e007 100644 --- a/packaging_apps_git.md +++ b/packaging_apps_git.md @@ -1,10 +1,10 @@ -# How to use git to package apps +# How to use Git to package apps Git... Our dear beloved Git, which can be described also as "Goddamn Idiotic Truckload of sh*t", according to Linus. -Be sure if you don't know git yet that you will soon agree with that description. +Be sure if you don't know Git yet that you will soon agree with that description. -YunoHost and all our apps are on the git forge GitHub. Which means that if you want to work on an app, sooner or later you're going to have to deal with git. -So let's see how to work with git to be able to contribute in the context of YunoHost. +YunoHost and all our apps are on the Git forge GitHub. Which means that if you want to work on an app, sooner or later you're going to have to deal with Git. +So let's see how to work with Git to be able to contribute in the context of YunoHost. ## Working with GitHub @@ -38,8 +38,7 @@ If you have the permission to write, you will just edit the file, without forkin #### Commit your changes When you're done with your modification on the file, you can commit your changes. -Behind that word, the idea is quite simple, you're just going to save your changes... - +Behind that word, the idea is quite simple, you're just going to save your changes... The first field is the name of your commit, a very short sentence to explain why you did this modification. @@ -89,7 +88,7 @@ Your repo will be moved into the organization, you don't have to remove the orig As we have seen, you can do a lot of things directly on GitHub. But when you need to edit multiple files, or when you need to work on your code on your own, it's better to work directly on your computer. -Before going to the hellish part of git, let's see 2 different ways to start working with git. +Before going to the hellish part of Git, let's see 2 different ways to start working with Git. #### First case: Creating a new package @@ -107,7 +106,7 @@ git clone https://github.com/YunoHost/example_ynh ``` `git clone` will download a copy of the repository. You will have the complete repository, with its branches, commits, and everything (into that apparently little `.git` directory). -To git clone is usually the starting point of any local work with git. +To git clone is usually the starting point of any local work with Git. *A side note though, if you expect to send your modifications back to the distant repository on GitHub, be sure to have the permission to write on this repository. Otherwise, fork before and clone your fork, on which you do have the permission.* @@ -144,7 +143,7 @@ If it appears that you're not on the branch you wanted to be, or you're actually ``` git checkout testing ``` -*Read carefully what git says when you validate a command, do never forget that git is sneaky...* +*Read carefully what Git says when you validate a command, do never forget that Git is sneaky...* #### Git pull before anything else @@ -152,7 +151,7 @@ You're finally on the right branch, and ready to work. **Wait ! A nasty trap is waiting for you...** Before ending up in an inextricable situation. Start with a `git pull` to update your branch to the latest change from the distant repository. -*Sometimes, you will encounter an impossible situation where git is saying that you can't pull because you have local changes. But you don't care of those local modifications, you just want to get the last version of the distant branch. But git don't care about what YOU want...* +*Sometimes, you will encounter an impossible situation where Git is saying that you can't pull because you have local changes. But you don't care of those local modifications, you just want to get the last version of the distant branch. But Git don't care about what YOU want...* *I have to admit that my only solution is as highly efficient as dirty... A good old `rm -r` of the repository and a `git clone`* #### Let's work @@ -160,7 +159,7 @@ Before ending up in an inextricable situation. Start with a `git pull` to update Eventually, you can work on your code. When you are finally ok with what you have done, it's time to validate your work. -The first step is to inform git about which file(s) to validate. To do so, we'll use `git add` +The first step is to inform Git about which file(s) to validate. To do so, we'll use `git add` ``` git add my_file git add my_other_file and_also_this_one @@ -182,7 +181,7 @@ To create a new branch and move to this branch, you can use `git checkout -b my_ #### Commit -To commit is simply to validate your work in git. As you can do in GitHub. +To commit is simply to validate your work in Git. As you can do in GitHub. To have the same fields that you had on GitHub, with the name of the commit, and a longer explanation. You can simply use `git commit`. The first line, before the comments, is for the name of the commit. After all the comments, you can add an explanation if you want to. diff --git a/packaging_apps_git_fr.md b/packaging_apps_git_fr.md new file mode 100644 index 00000000..2b4b45d4 --- /dev/null +++ b/packaging_apps_git_fr.md @@ -0,0 +1,200 @@ +# Comment utiliser Git pour packager les applications + +Git... Notre cher Git bien-aimé, que l'on peut aussi décrire comme "Goddamn Idiotic Truckload of sh*t", selon Linus. +Si vous ne connaissez pas encore Git, soyez sûr que vous serez bientôt d'accord avec cette description. + +YunoHost et toutes nos applications sont sur la forge Git GitHub. Ce qui veut dire que si vous voulez travailler sur une application, tôt ou tard vous allez devoir faire face à Git. +Alors voyons comment travailler avec Git pour pouvoir contribuer dans le contexte de YunoHost. + +## Travailler avec GitHub + +Commençons par la partie facile, GitHub est livré avec une interface web "facile" à utiliser. + +*Tout d'abord, malheureusement il n'y a pas moyen de contourner ça, vous devez avoir un compte sur GitHub.* + +#### Branches + +Ensuite, et c'est probablement l'une des choses les plus importantes, **ne travaillez pas directement sur la branche master**. +Désolé, il fallait que ce soit dit ! + +Les branches sont, comme l'explique GitHub, "*une version parallèle d'un dépôt. Elle est contenue dans le dépôt, mais n'affecte pas les autres branches. Elle vous permet de travailler librement sans perturber la version "live".*" + +La branche master est la branche qui contient la version de l'application que les utilisateurs installeront et utiliseront effectivement. +La chose habituelle à faire est de travailler à partir de la branche testing, et lorsque tout est réglé et testé, vous pouvez fusionner la branche testing dans master, afin que les utilisateurs puissent profiter de la nouvelle version de votre package. + +Pour voir et modifier la branche actuelle, utilisez ce bouton : + + +#### Modifier un fichier + +Maintenant que vous êtes sur la bonne branche, voyons comment éditer un fichier sur GitHub. + +Vous pouvez éditer n'importe quel fichier en utilisant l'icône du petit crayon : + + +Si vous n'avez pas la permission d'écrire sur le dépôt, vous verrez (comme sur l'image) que vous allez créer un fork (nous verrons plus loin ce qu'est un fork). +Si vous avez la permission d'écrire, vous allez simplement modifier le fichier, sans forker. + +#### Validez vos modifications + +Lorsque vous avez fini de modifier le fichier, vous pouvez faire un commit de vos modifications. +Derrière ce mot, l'idée est assez simple, vous allez juste enregistrer vos modifications... + + +Le premier champ est le nom de votre commit, une phrase très courte pour expliquer pourquoi vous avez fait cette modification. +Le deuxième champ est un champ plus grand pour une explication plus complète, si vous en avez besoin. + +Enfin, si vous modifiez un dépôt sur lequel vous avez la permission d'écrire, vous pouvez soit faire un commit directement sur la branche en cours, soit créer une nouvelle branche. +Il est généralement préférable de créer une nouvelle branche, de cette façon vous gardez vos modifications sur une version *parallèle* du dépôt. Vos modifications seront discutées dans une pull request (expliquée ci-dessous) puis finalement fusionnées dans la branche d'origine. + +#### Forker ou ne pas forker + +Un fork est une copie d'un dépôt sur votre propre compte. +Nous avons déjà vu que si vous n'avez pas l'autorisation d'écrire dans un dépôt, la modification d'un fichier créera automatiquement un fork. +Comme le fork est sur votre compte, vous avez toujours la permission d'écrire dessus. +Mais même si un fork n'est pas le véritable dépôt, mais juste une copie, un fork est toujours lié à son parent. Nous verrons plus tard que la création d'un fork est vraiment utile lors de l'ouverture d'une pull request. + +Lorsque vous créez un nouveau package, il est courant d'utiliser l'[application d'exemple](https://github.com/YunoHost/example_ynh) comme base. +Mais, comme vous ne voulez pas garder ce lien vers l'application d'exemple, vous ne devez pas forker l'application d'exemple. Vous la clonerez plutôt. +Malheureusement, cloner une application est un peu plus compliqué sur GitHub. Nous verrons plus tard comment cloner vers un dépôt local à la place. + +Nous avons vu comment éditer un fichier, et comment cela peut forker l'application. +Mais, lorsque vous voulez éditer plusieurs fichiers, l'interface GitHub n'est pas vraiment la meilleure solution. Dans une telle situation, vous préférez cloner le dépôt et travailler sur un dépôt local. +Il se peut que vous deviez tout de même forker sur votre propre compte pour pouvoir enregistrer vos modifications si vous n'avez pas les autorisations sur le dépôt distant. + +#### Pull request + +Après avoir effectué vos commits, que ce soit sur une branche ou un fork, vous souhaitez proposer vos modifications pour qu'elles soient intégrées dans le dépôt principal, ou dans la branche d'origine. +Pour ce faire, vous allez créer une pull request. GitHub vous demande généralement directement si vous souhaitez le faire. +Sinon, vous trouverez le bouton de création d'une pull request juste ici : + + +Lors de la création d'une pull request à partir d'un fork, pour faciliter le travail de révision du code, **ne jamais** décocher la case *Allow edits from maintainers*. Cette option permet simplement aux mainteneurs du dépôt d'origine de modifier directement votre travail. + +#### Organisation YunoHost-Apps + +Conformément à la [YEP 1.7](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines.md#yep-17), votre application doit être intégrée à l'organisation YunoHost-Apps, mais si vous n'avez jamais contribué à une application auparavant ou si vous n'avez jamais eu d'application dans cette organisation, vous n'en aurez peut-être pas l'autorisation. + +Tout d'abord, vous devez avoir la permission d'écrire dans l'organisation, pour ce faire, demandez au groupe Apps sur le salon xmpp Apps. + +Pour transférer votre application sur l'organisation YunoHost-Apps, allez dans votre dépôt et dans l'onglet *Settings*. +En bas de la page, vous trouverez *Transfer ownership*. +Dans le champ *New owner’s GitHub username or organization name*, tapez *YunoHost-Apps*. +Votre dépôt sera déplacé dans l'organisation, vous n'avez pas besoin de supprimer le dépôt d'origine. + + +## Travailler avec Git en local + +Comme nous l'avons vu, vous pouvez faire beaucoup de choses directement sur GitHub. +Mais lorsque vous devez modifier plusieurs fichiers, ou lorsque vous devez travailler sur votre code de votre côté, il est préférable de travailler directement sur votre ordinateur. + +Avant d'aller dans la partie infernale de Git, voyons 2 façons différentes de commencer à travailler avec Git. + +#### Premier cas : Créer un nouveau package + +Vous avez découvert, choqué, que la merveilleuse application que vous aimez utiliser tous les jours n'a pas encore son package YunoHost. Et parce que vous êtes sympa, vous avez décidé de créer vous-même le package, pour que tout le monde puisse apprécier cette application. +Quelle bonne idée ! + +Le mieux est de commencer par l'[application d'exemple] (https://github.com/YunoHost/example_ynh). Mais comme nous l'avons déjà expliqué, vous ne voulez pas forker, parce que si vous le faites, vous allez garder ce lien vers l'application d'exemple et c'est vraiment ennuyeux. +Donc, vous allez le faire différemment. Vous allez cloner ! + +##### git clone + +Pour cloner, vous allez faire : +``` +git clone https://github.com/YunoHost/example_ynh +``` +`git clone` téléchargera une copie du dépôt. Vous aurez le dépôt complet, avec ses branches, ses commits, et tout le reste (dans cet apparent petit répertoire `.git`). + +git clone est généralement le point de départ de tout travail local avec Git. + +*Toutefois, si vous comptez envoyer vos modifications sur le dépôt distant sur GitHub, assurez-vous d'avoir les droits d'écriture sur ce dépôt. Sinon, forkez avant et clonez votre fork, pour lequel vous avez la permission.* + +##### Mon tout nouveau package, suite + +Dans le contexte d'un nouveau package, vous devrez également créer un dépôt sur GitHub pour y mettre votre package. Ce qui n'est pas plus compliqué qu'un gros bouton vert *New*. +Ne vous embêtez pas avec des README, .gitignore ou licence. Créez simplement le dépôt lui-même. +vous pouvez maintenant cloner ce nouveau dépôt avec Git. + + +Vous disposez maintenant de 2 dépôts clonés sur votre ordinateur. +Copiez tous les fichiers de l'application example_ynh, **excepté le répertoire .git** (vous voulez juste les fichiers eux-mêmes) dans votre nouveau package. + +*Si vous le souhaitez, vous pouvez supprimer l'application example_ynh. Nous n'en avons plus besoin.* + +Vous êtes prêt à travailler sur votre nouveau package ! + +#### Deuxième cas : Travailler localement sur un dépôt + +Vous disposez déjà d'un dépôt, mais ce que vous voulez, c'est travailler localement, de sorte que vous puissiez modifier plusieurs fichiers. +Il vous suffit de cloner le dépôt, le répertoire .git est le lien vers le dépôt distant. Rien d'autre à faire qu'un `git clone`. + +#### Branches + +Vous avez bien votre copie local du dépôt, mais comme vous avez lu attentivement cette documentation jusque-là, vous savez que vous devez vous assurer d'être sur la branche testing avant de commencer à travailler. + +Pour voir les branches, et savoir sur quelle branche vous êtes réellement, alors que vous êtes dans le répertoire de votre dépôt, tapez `git branch`. +La branche courante est mise en évidence et précédée d'un "*". + +#### git checkout + +S'il apparaît que vous n'êtes pas sur la branche où vous vouliez être, ou que vous êtes en fait sur master (ce qui est mal !), vous pouvez passer à une autre branche avec `git checkout`. +``` +git checkout testing +``` +*Lisez attentivement ce que Git dit quand vous validez une commande, n'oubliez jamais que Git est sournois...* + +#### git pull avant tout + +Vous êtes enfin dans la bonne branche, et prêt à travailler. +**Attendez ! Un vilain piège vous attend...** +Avant de vous retrouver dans une situation inextricable. Commencez par un `git pull` pour mettre à jour votre branche avec les derniers changements du dépôt distant. + +*Parfois, vous rencontrerez une situation impossible où Git vous dira que vous ne pouvez pas pull parce que vous avez des changements locaux. Mais vous ne vous souciez pas de ces modifications locales, vous voulez juste obtenir la dernière version de la branche distante. Mais Git ne se soucie pas de ce que VOUS voulez...* +*Je dois admettre que ma seule solution est aussi efficace que sale... Un bon vieux `rm -r` du dépôt et un `git clone`* + +#### Il est temps de travailler + +Vous pouvez finalement travailler sur votre code. +Lorsque vous êtes enfin d'accord avec ce que vous avez fait, il est temps de valider votre travail. + +La première étape consiste à informer Git sur le(s) fichier(s) à valider. Pour ce faire, nous utiliserons `git add`. +``` +git add mon_fichier +ajouter mon_autre_fichier et_aussi_celui_ci +``` +Si vous souhaitez valider tous votre travail, vous pouvez aussi simplement faire +``` +git add --all +``` + +Pour vérifier l'état actuel de votre validation, vous pouvez utiliser `git status`. Il vous montrera quels fichiers seront inclus dans votre commit, et quels fichiers sont modifiés, mais pas encore inclus. +`git status -v` vous indiquera également quelle partie des fichiers est modifiée. Une bonne façon de s'assurer que vous n'avez pas fait d'erreur avant de faire un commit. + +#### git checkout -b + +Avant de faire un commit, ou après, ou avant de commencer à travailler. Quand vous en avez envie ! +Vous devriez envisager d'ajouter votre travail à une branche séparée, de cette façon, il sera facile de créer une pull request dans la branche testing et de discuter avec les autres packagers de ce que vous suggérez de changer. + +Pour créer une nouvelle branche et passer à cette branche, vous pouvez utiliser `git checkout -b my_new_branch`. + +#### Commit + +Faire un commit, c'est simplement valider son travail dans Git. Comme vous pouvez le faire dans GitHub. +Pour avoir les mêmes champs que vous aviez sur GitHub, avec le nom du commit, et une explication plus longue. Vous pouvez simplement utiliser `git commit`. +La première ligne, avant les commentaires, est pour le nom du commit. +Après tous les commentaires, vous pouvez ajouter une explication si vous le souhaitez. + +Si vous voulez faire un commit avec seulement un nom pour votre commit, vous pouvez utiliser une simple commande : +``` +git commit -m "My commit name" +``` + +#### Push vers le dépôt distant + +Vos modifications sont validées, mais uniquement sur votre clone local du dépôt. Maintenant, vous devez renvoyer ces modifications sur le dépôt distant sur GitHub. +Pour ce faire, vous devez savoir quelle est votre branche actuelle. (Si vous ne le savez pas, `git branch` vous donnera cette information). +Ensuite, vous pouvez git push +``` +git push -u origin BRANCH_NAME +``` From 4511f6c8acd3d9704391e4eaf681294c5ec04be1 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sun, 5 Apr 2020 22:50:07 +0200 Subject: [PATCH 05/10] Tell simone that's bash... --- packaging_apps_git_fr.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packaging_apps_git_fr.md b/packaging_apps_git_fr.md index 2b4b45d4..b66fefc4 100644 --- a/packaging_apps_git_fr.md +++ b/packaging_apps_git_fr.md @@ -101,7 +101,7 @@ Donc, vous allez le faire différemment. Vous allez cloner ! ##### git clone Pour cloner, vous allez faire : -``` +```bash git clone https://github.com/YunoHost/example_ynh ``` `git clone` téléchargera une copie du dépôt. Vous aurez le dépôt complet, avec ses branches, ses commits, et tout le reste (dans cet apparent petit répertoire `.git`). @@ -139,7 +139,7 @@ La branche courante est mise en évidence et précédée d'un "*". #### git checkout S'il apparaît que vous n'êtes pas sur la branche où vous vouliez être, ou que vous êtes en fait sur master (ce qui est mal !), vous pouvez passer à une autre branche avec `git checkout`. -``` +```bash git checkout testing ``` *Lisez attentivement ce que Git dit quand vous validez une commande, n'oubliez jamais que Git est sournois...* @@ -159,12 +159,12 @@ Vous pouvez finalement travailler sur votre code. Lorsque vous êtes enfin d'accord avec ce que vous avez fait, il est temps de valider votre travail. La première étape consiste à informer Git sur le(s) fichier(s) à valider. Pour ce faire, nous utiliserons `git add`. -``` +```bash git add mon_fichier ajouter mon_autre_fichier et_aussi_celui_ci ``` Si vous souhaitez valider tous votre travail, vous pouvez aussi simplement faire -``` +```bash git add --all ``` @@ -186,7 +186,7 @@ La première ligne, avant les commentaires, est pour le nom du commit. Après tous les commentaires, vous pouvez ajouter une explication si vous le souhaitez. Si vous voulez faire un commit avec seulement un nom pour votre commit, vous pouvez utiliser une simple commande : -``` +```bash git commit -m "My commit name" ``` @@ -195,6 +195,6 @@ git commit -m "My commit name" Vos modifications sont validées, mais uniquement sur votre clone local du dépôt. Maintenant, vous devez renvoyer ces modifications sur le dépôt distant sur GitHub. Pour ce faire, vous devez savoir quelle est votre branche actuelle. (Si vous ne le savez pas, `git branch` vous donnera cette information). Ensuite, vous pouvez git push -``` +```bash git push -u origin BRANCH_NAME ``` From 491705e177001f89d6b0055c7a3351142ea5af51 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sun, 5 Apr 2020 22:51:56 +0200 Subject: [PATCH 06/10] Tell simone that's bash... --- packaging_apps_git.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packaging_apps_git.md b/packaging_apps_git.md index 7fd2e007..1ddb6ff2 100644 --- a/packaging_apps_git.md +++ b/packaging_apps_git.md @@ -101,7 +101,7 @@ So, you're going to do it differently. You're going to clone ! ##### git clone To clone, you're going to do: -``` +```bash git clone https://github.com/YunoHost/example_ynh ``` `git clone` will download a copy of the repository. You will have the complete repository, with its branches, commits, and everything (into that apparently little `.git` directory). @@ -140,7 +140,7 @@ The current branch is highlighted and preceded by a `*`. #### git checkout If it appears that you're not on the branch you wanted to be, or you're actually on master (which is bad !), you can move to another branch with `git checkout` -``` +```bash git checkout testing ``` *Read carefully what Git says when you validate a command, do never forget that Git is sneaky...* @@ -160,12 +160,12 @@ Eventually, you can work on your code. When you are finally ok with what you have done, it's time to validate your work. The first step is to inform Git about which file(s) to validate. To do so, we'll use `git add` -``` +```bash git add my_file git add my_other_file and_also_this_one ``` If you want to validate all your work, you can also simply do -``` +```bash git add --all ``` @@ -187,7 +187,7 @@ The first line, before the comments, is for the name of the commit. After all the comments, you can add an explanation if you want to. If you want to commit with only a name for your commit, you can use a simple command: -``` +```bash git commit -m "My commit name" ``` @@ -196,6 +196,6 @@ git commit -m "My commit name" Your changes are validated, but only on your local clone of the repository. Now, you have to send those modifications back to the distant repository on GitHub. In order to do that, you need to know what is your current branch. (If you don't know, `git branch` will give you that info). Then you can git push -``` +```bash git push -u origin BRANCH_NAME ``` From 5b5baca40d873f7ec282742a31379583bd7f0c8f Mon Sep 17 00:00:00 2001 From: Plumf Date: Mon, 6 Apr 2020 19:39:40 +0200 Subject: [PATCH 07/10] git adaptation --- packaging_apps_git_fr.md | 98 ++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/packaging_apps_git_fr.md b/packaging_apps_git_fr.md index b66fefc4..b8e3ccc9 100644 --- a/packaging_apps_git_fr.md +++ b/packaging_apps_git_fr.md @@ -1,72 +1,72 @@ # Comment utiliser Git pour packager les applications -Git... Notre cher Git bien-aimé, que l'on peut aussi décrire comme "Goddamn Idiotic Truckload of sh*t", selon Linus. +Git... Notre cher Git bien-aimé, que l'on peut aussi décrire comme "Goddamn Idiotic Truckload of sh*t" ( P *t**n de camion de m*rde), selon Linus. Si vous ne connaissez pas encore Git, soyez sûr que vous serez bientôt d'accord avec cette description. -YunoHost et toutes nos applications sont sur la forge Git GitHub. Ce qui veut dire que si vous voulez travailler sur une application, tôt ou tard vous allez devoir faire face à Git. +YunoHost et toutes nos applications sont sur la forge Git GitHub. Ce qui veut dire que si vous voulez travailler sur une application, tôt ou tard vous allez devoir faire face à Git. Alors voyons comment travailler avec Git pour pouvoir contribuer dans le contexte de YunoHost. ## Travailler avec GitHub Commençons par la partie facile, GitHub est livré avec une interface web "facile" à utiliser. -*Tout d'abord, malheureusement il n'y a pas moyen de contourner ça, vous devez avoir un compte sur GitHub.* +*Tout d'abord et malheureusement, il n'y a pas moyen de contourner ça, vous devez avoir un compte sur GitHub.* #### Branches -Ensuite, et c'est probablement l'une des choses les plus importantes, **ne travaillez pas directement sur la branche master**. +Ensuite, et c'est probablement l'une des choses les plus importantes, **ne travaillez pas directement sur la branche master**. Désolé, il fallait que ce soit dit ! Les branches sont, comme l'explique GitHub, "*une version parallèle d'un dépôt. Elle est contenue dans le dépôt, mais n'affecte pas les autres branches. Elle vous permet de travailler librement sans perturber la version "live".*" -La branche master est la branche qui contient la version de l'application que les utilisateurs installeront et utiliseront effectivement. -La chose habituelle à faire est de travailler à partir de la branche testing, et lorsque tout est réglé et testé, vous pouvez fusionner la branche testing dans master, afin que les utilisateurs puissent profiter de la nouvelle version de votre package. +La branche master est la branche qui contient la version de l'application que les utilisateurs installeront et utiliseront effectivement. +La bonne habitude à prendre est de travailler à partir de la branche testing, et lorsque tout est réglé et testé, vous pouvez fusionner la branche testing dans master, afin que les utilisateurs puissent profiter de la nouvelle version de votre package. -Pour voir et modifier la branche actuelle, utilisez ce bouton : +Pour voir et modifier la branche actuelle, utilisez ce bouton : #### Modifier un fichier Maintenant que vous êtes sur la bonne branche, voyons comment éditer un fichier sur GitHub. -Vous pouvez éditer n'importe quel fichier en utilisant l'icône du petit crayon : +Vous pouvez éditer n'importe quel fichier en utilisant l'icône du petit crayon : -Si vous n'avez pas la permission d'écrire sur le dépôt, vous verrez (comme sur l'image) que vous allez créer un fork (nous verrons plus loin ce qu'est un fork). +Si vous n'avez pas la permission d'écrire sur le dépôt, vous verrez (comme sur l'image) que vous allez créer un fork (nous verrons plus loin ce qu'est un fork). Si vous avez la permission d'écrire, vous allez simplement modifier le fichier, sans forker. #### Validez vos modifications -Lorsque vous avez fini de modifier le fichier, vous pouvez faire un commit de vos modifications. -Derrière ce mot, l'idée est assez simple, vous allez juste enregistrer vos modifications... +Lorsque vous avez fini de modifier le fichier, vous pouvez faire un commit de vos modifications. +Derrière ce mot, l'idée est assez simple, vous allez juste enregistrer vos modifications... -Le premier champ est le nom de votre commit, une phrase très courte pour expliquer pourquoi vous avez fait cette modification. +Le premier champ est le nom de votre commit, une phrase très courte pour expliquer pourquoi vous avez fait cette modification. Le deuxième champ est un champ plus grand pour une explication plus complète, si vous en avez besoin. -Enfin, si vous modifiez un dépôt sur lequel vous avez la permission d'écrire, vous pouvez soit faire un commit directement sur la branche en cours, soit créer une nouvelle branche. +Enfin, si vous modifiez un dépôt sur lequel vous avez la permission d'écrire, vous pouvez soit faire un commit directement sur la branche en cours, soit créer une nouvelle branche. Il est généralement préférable de créer une nouvelle branche, de cette façon vous gardez vos modifications sur une version *parallèle* du dépôt. Vos modifications seront discutées dans une pull request (expliquée ci-dessous) puis finalement fusionnées dans la branche d'origine. #### Forker ou ne pas forker -Un fork est une copie d'un dépôt sur votre propre compte. -Nous avons déjà vu que si vous n'avez pas l'autorisation d'écrire dans un dépôt, la modification d'un fichier créera automatiquement un fork. -Comme le fork est sur votre compte, vous avez toujours la permission d'écrire dessus. +Un fork est une copie d'un dépôt sur votre propre compte. +Nous avons déjà vu que si vous n'avez pas l'autorisation d'écrire dans un dépôt, la modification d'un fichier créera automatiquement un fork. +Comme le fork est sur votre compte, vous avez toujours la permission d'écrire dessus. Mais même si un fork n'est pas le véritable dépôt, mais juste une copie, un fork est toujours lié à son parent. Nous verrons plus tard que la création d'un fork est vraiment utile lors de l'ouverture d'une pull request. -Lorsque vous créez un nouveau package, il est courant d'utiliser l'[application d'exemple](https://github.com/YunoHost/example_ynh) comme base. -Mais, comme vous ne voulez pas garder ce lien vers l'application d'exemple, vous ne devez pas forker l'application d'exemple. Vous la clonerez plutôt. +Lorsque vous créez un nouveau package, il est courant d'utiliser l'[application exemple](https://github.com/YunoHost/example_ynh) comme base. +Mais, comme vous ne voulez pas garder ce lien vers l'application d'exemple, vous ne devez pas forker l'application d'exemple. Vous la clonerez plutôt. Malheureusement, cloner une application est un peu plus compliqué sur GitHub. Nous verrons plus tard comment cloner vers un dépôt local à la place. -Nous avons vu comment éditer un fichier, et comment cela peut forker l'application. -Mais, lorsque vous voulez éditer plusieurs fichiers, l'interface GitHub n'est pas vraiment la meilleure solution. Dans une telle situation, vous préférez cloner le dépôt et travailler sur un dépôt local. +Nous avons vu comment éditer un fichier, et comment cela peut forker l'application. +Mais, lorsque vous voulez éditer plusieurs fichiers, l'interface GitHub n'est pas vraiment la meilleure solution. Dans une telle situation, vous préférerez cloner le dépôt et travailler sur un dépôt local. Il se peut que vous deviez tout de même forker sur votre propre compte pour pouvoir enregistrer vos modifications si vous n'avez pas les autorisations sur le dépôt distant. #### Pull request -Après avoir effectué vos commits, que ce soit sur une branche ou un fork, vous souhaitez proposer vos modifications pour qu'elles soient intégrées dans le dépôt principal, ou dans la branche d'origine. -Pour ce faire, vous allez créer une pull request. GitHub vous demande généralement directement si vous souhaitez le faire. -Sinon, vous trouverez le bouton de création d'une pull request juste ici : +Après avoir effectué vos commits, que ce soit sur une branche ou un fork, vous souhaitez proposer vos modifications pour qu'elles soient intégrées dans le dépôt principal, ou dans la branche d'origine. +Pour ce faire, vous allez créer une pull request. GitHub vous demande généralement directement si vous souhaitez le faire. +Sinon, vous trouverez le bouton de création d'une pull request juste ici : Lors de la création d'une pull request à partir d'un fork, pour faciliter le travail de révision du code, **ne jamais** décocher la case *Allow edits from maintainers*. Cette option permet simplement aux mainteneurs du dépôt d'origine de modifier directement votre travail. @@ -77,25 +77,25 @@ Conformément à la [YEP 1.7](https://github.com/YunoHost/doc/blob/master/packag Tout d'abord, vous devez avoir la permission d'écrire dans l'organisation, pour ce faire, demandez au groupe Apps sur le salon xmpp Apps. -Pour transférer votre application sur l'organisation YunoHost-Apps, allez dans votre dépôt et dans l'onglet *Settings*. -En bas de la page, vous trouverez *Transfer ownership*. -Dans le champ *New owner’s GitHub username or organization name*, tapez *YunoHost-Apps*. +Pour transférer votre application sur l'organisation YunoHost-Apps, allez dans votre dépôt et dans l'onglet *Settings*. +En bas de la page, vous trouverez *Transfer ownership*. +Dans le champ *New owner’s GitHub username or organization name*, tapez *YunoHost-Apps*. Votre dépôt sera déplacé dans l'organisation, vous n'avez pas besoin de supprimer le dépôt d'origine. ## Travailler avec Git en local -Comme nous l'avons vu, vous pouvez faire beaucoup de choses directement sur GitHub. +Comme nous l'avons vu, vous pouvez faire beaucoup de choses directement sur GitHub. Mais lorsque vous devez modifier plusieurs fichiers, ou lorsque vous devez travailler sur votre code de votre côté, il est préférable de travailler directement sur votre ordinateur. Avant d'aller dans la partie infernale de Git, voyons 2 façons différentes de commencer à travailler avec Git. #### Premier cas : Créer un nouveau package -Vous avez découvert, choqué, que la merveilleuse application que vous aimez utiliser tous les jours n'a pas encore son package YunoHost. Et parce que vous êtes sympa, vous avez décidé de créer vous-même le package, pour que tout le monde puisse apprécier cette application. +Vous avez découvert, choqué, que la merveilleuse application que vous aimez utiliser tous les jours n'a pas encore son package YunoHost. Et parce que vous êtes sympa, vous avez décidé de créer vous-même le package, pour que tout le monde puisse apprécier cette application. Quelle bonne idée ! -Le mieux est de commencer par l'[application d'exemple] (https://github.com/YunoHost/example_ynh). Mais comme nous l'avons déjà expliqué, vous ne voulez pas forker, parce que si vous le faites, vous allez garder ce lien vers l'application d'exemple et c'est vraiment ennuyeux. +Le mieux est de commencer par l'[application d'exemple](https://github.com/YunoHost/example_ynh). Mais comme nous l'avons déjà expliqué, vous ne voulez pas forker, parce que si vous le faites, vous allez garder ce lien vers l'application d'exemple et c'est vraiment ennuyeux. Donc, vous allez le faire différemment. Vous allez cloner ! ##### git clone @@ -110,15 +110,15 @@ git clone est généralement le point de départ de tout travail local avec Git. *Toutefois, si vous comptez envoyer vos modifications sur le dépôt distant sur GitHub, assurez-vous d'avoir les droits d'écriture sur ce dépôt. Sinon, forkez avant et clonez votre fork, pour lequel vous avez la permission.* -##### Mon tout nouveau package, suite +##### Mon nouveau package, suite -Dans le contexte d'un nouveau package, vous devrez également créer un dépôt sur GitHub pour y mettre votre package. Ce qui n'est pas plus compliqué qu'un gros bouton vert *New*. -Ne vous embêtez pas avec des README, .gitignore ou licence. Créez simplement le dépôt lui-même. -vous pouvez maintenant cloner ce nouveau dépôt avec Git. +Dans le contexte d'un nouveau package, vous devrez également créer un dépôt sur GitHub pour y mettre votre package. Ce qui n'est pas plus compliqué qu'un gros bouton vert *New*. +Ne vous embêtez pas avec des README, .gitignore ou licence. Créez simplement le dépôt lui-même. +vous pouvez maintenant cloner ce nouveau dépôt avec Git. -Vous disposez maintenant de 2 dépôts clonés sur votre ordinateur. -Copiez tous les fichiers de l'application example_ynh, **excepté le répertoire .git** (vous voulez juste les fichiers eux-mêmes) dans votre nouveau package. +Vous disposez maintenant de 2 dépôts clonés sur votre ordinateur. +Copiez tous les fichiers de l'application example_ynh, **excepté le répertoire .git** (vous voulez juste les fichiers eux-mêmes) dans votre nouveau package. *Si vous le souhaitez, vous pouvez supprimer l'application example_ynh. Nous n'en avons plus besoin.* @@ -126,14 +126,14 @@ Vous êtes prêt à travailler sur votre nouveau package ! #### Deuxième cas : Travailler localement sur un dépôt -Vous disposez déjà d'un dépôt, mais ce que vous voulez, c'est travailler localement, de sorte que vous puissiez modifier plusieurs fichiers. +Vous disposez déjà d'un dépôt, mais ce que vous voulez, c'est travailler localement, de sorte que vous puissiez modifier plusieurs fichiers. Il vous suffit de cloner le dépôt, le répertoire .git est le lien vers le dépôt distant. Rien d'autre à faire qu'un `git clone`. #### Branches Vous avez bien votre copie local du dépôt, mais comme vous avez lu attentivement cette documentation jusque-là, vous savez que vous devez vous assurer d'être sur la branche testing avant de commencer à travailler. -Pour voir les branches, et savoir sur quelle branche vous êtes réellement, alors que vous êtes dans le répertoire de votre dépôt, tapez `git branch`. +Pour voir les branches, et savoir sur quelle branche vous êtes réellement, alors que vous êtes dans le répertoire de votre dépôt, tapez `git branch`. La branche courante est mise en évidence et précédée d'un "*". #### git checkout @@ -146,16 +146,16 @@ git checkout testing #### git pull avant tout -Vous êtes enfin dans la bonne branche, et prêt à travailler. -**Attendez ! Un vilain piège vous attend...** +Vous êtes enfin dans la bonne branche, et prêt à travailler. +**Attendez ! Un vilain piège vous attend...** Avant de vous retrouver dans une situation inextricable. Commencez par un `git pull` pour mettre à jour votre branche avec les derniers changements du dépôt distant. -*Parfois, vous rencontrerez une situation impossible où Git vous dira que vous ne pouvez pas pull parce que vous avez des changements locaux. Mais vous ne vous souciez pas de ces modifications locales, vous voulez juste obtenir la dernière version de la branche distante. Mais Git ne se soucie pas de ce que VOUS voulez...* +*Parfois, vous rencontrerez une situation impossible où Git vous dira que vous ne pouvez pas pull parce que vous avez des changements locaux. Mais vous ne vous souciez pas de ces modifications locales, vous voulez juste obtenir la dernière version de la branche distante. Mais Git ne se soucie pas de ce que VOUS voulez...* *Je dois admettre que ma seule solution est aussi efficace que sale... Un bon vieux `rm -r` du dépôt et un `git clone`* #### Il est temps de travailler -Vous pouvez finalement travailler sur votre code. +Vous pouvez finalement travailler sur votre code. Lorsque vous êtes enfin d'accord avec ce que vous avez fait, il est temps de valider votre travail. La première étape consiste à informer Git sur le(s) fichier(s) à valider. Pour ce faire, nous utiliserons `git add`. @@ -163,26 +163,26 @@ La première étape consiste à informer Git sur le(s) fichier(s) à valider. Po git add mon_fichier ajouter mon_autre_fichier et_aussi_celui_ci ``` -Si vous souhaitez valider tous votre travail, vous pouvez aussi simplement faire +Si vous souhaitez valider l'ensemble de votre travail, vous pouvez aussi simplement faire ```bash git add --all ``` -Pour vérifier l'état actuel de votre validation, vous pouvez utiliser `git status`. Il vous montrera quels fichiers seront inclus dans votre commit, et quels fichiers sont modifiés, mais pas encore inclus. +Pour vérifier l'état actuel de votre validation, vous pouvez utiliser `git status`. Il vous montrera quels fichiers seront inclus dans votre commit, et quels fichiers sont modifiés, mais pas encore inclus. `git status -v` vous indiquera également quelle partie des fichiers est modifiée. Une bonne façon de s'assurer que vous n'avez pas fait d'erreur avant de faire un commit. #### git checkout -b -Avant de faire un commit, ou après, ou avant de commencer à travailler. Quand vous en avez envie ! +Avant de faire un commit, ou après, ou avant de commencer à travailler. Quand vous en avez envie ! Vous devriez envisager d'ajouter votre travail à une branche séparée, de cette façon, il sera facile de créer une pull request dans la branche testing et de discuter avec les autres packagers de ce que vous suggérez de changer. Pour créer une nouvelle branche et passer à cette branche, vous pouvez utiliser `git checkout -b my_new_branch`. #### Commit -Faire un commit, c'est simplement valider son travail dans Git. Comme vous pouvez le faire dans GitHub. -Pour avoir les mêmes champs que vous aviez sur GitHub, avec le nom du commit, et une explication plus longue. Vous pouvez simplement utiliser `git commit`. -La première ligne, avant les commentaires, est pour le nom du commit. +Faire un commit, c'est simplement valider son travail dans Git. Comme vous pouvez le faire dans GitHub. +Pour avoir les mêmes champs que vous aviez sur GitHub, avec le nom du commit, et une explication plus longue. Vous pouvez simplement utiliser `git commit`. +La première ligne, avant les commentaires, est pour le nom du commit. Après tous les commentaires, vous pouvez ajouter une explication si vous le souhaitez. Si vous voulez faire un commit avec seulement un nom pour votre commit, vous pouvez utiliser une simple commande : @@ -192,8 +192,8 @@ git commit -m "My commit name" #### Push vers le dépôt distant -Vos modifications sont validées, mais uniquement sur votre clone local du dépôt. Maintenant, vous devez renvoyer ces modifications sur le dépôt distant sur GitHub. -Pour ce faire, vous devez savoir quelle est votre branche actuelle. (Si vous ne le savez pas, `git branch` vous donnera cette information). +Vos modifications sont validées, mais uniquement sur votre clone local du dépôt. Maintenant, vous devez renvoyer ces modifications sur le dépôt distant sur GitHub. +Pour ce faire, vous devez savoir quelle est votre branche actuelle. (Si vous ne le savez pas, `git branch` vous donnera cette information). Ensuite, vous pouvez git push ```bash git push -u origin BRANCH_NAME From 1dbacb07d9cbd20a45a97681d14ecbf9fbc94957 Mon Sep 17 00:00:00 2001 From: Plumf Date: Wed, 8 Apr 2020 13:03:08 +0200 Subject: [PATCH 08/10] correction --- packaging_apps_git_fr.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packaging_apps_git_fr.md b/packaging_apps_git_fr.md index b8e3ccc9..12d9748a 100644 --- a/packaging_apps_git_fr.md +++ b/packaging_apps_git_fr.md @@ -1,6 +1,6 @@ # Comment utiliser Git pour packager les applications -Git... Notre cher Git bien-aimé, que l'on peut aussi décrire comme "Goddamn Idiotic Truckload of sh*t" ( P *t**n de camion de m*rde), selon Linus. +Git... Notre cher Git bien-aimé, que l'on peut aussi décrire comme "Goddamn Idiotic Truckload of sh*t" (Un stupide putain gros tas de merde), selon Linus. Si vous ne connaissez pas encore Git, soyez sûr que vous serez bientôt d'accord avec cette description. YunoHost et toutes nos applications sont sur la forge Git GitHub. Ce qui veut dire que si vous voulez travailler sur une application, tôt ou tard vous allez devoir faire face à Git. @@ -112,7 +112,8 @@ git clone est généralement le point de départ de tout travail local avec Git. ##### Mon nouveau package, suite -Dans le contexte d'un nouveau package, vous devrez également créer un dépôt sur GitHub pour y mettre votre package. Ce qui n'est pas plus compliqué qu'un gros bouton vert *New*. +Dans le contexte d'un nouveau package, vous devrez également créer un dépôt sur GitHub pour y mettre votre package. +Ce qui n'est pas plus compliqué qu'un gros bouton vert *New*. Ne vous embêtez pas avec des README, .gitignore ou licence. Créez simplement le dépôt lui-même. vous pouvez maintenant cloner ce nouveau dépôt avec Git. @@ -193,7 +194,7 @@ git commit -m "My commit name" #### Push vers le dépôt distant Vos modifications sont validées, mais uniquement sur votre clone local du dépôt. Maintenant, vous devez renvoyer ces modifications sur le dépôt distant sur GitHub. -Pour ce faire, vous devez savoir quelle est votre branche actuelle. (Si vous ne le savez pas, `git branch` vous donnera cette information). +Pour ce faire, vous devez savoir quelle est votre branche actuelle. (Si vous ne le savez pas, `git branch` vous donnera cette information). Ensuite, vous pouvez git push ```bash git push -u origin BRANCH_NAME From d426601e432741f3fc5f7ae00b69770040d12481 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 8 Apr 2020 13:19:43 +0200 Subject: [PATCH 09/10] Put back spaces at the end of lines --- packaging_apps_git_fr.md | 84 ++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/packaging_apps_git_fr.md b/packaging_apps_git_fr.md index 12d9748a..2cc085ad 100644 --- a/packaging_apps_git_fr.md +++ b/packaging_apps_git_fr.md @@ -1,9 +1,9 @@ # Comment utiliser Git pour packager les applications -Git... Notre cher Git bien-aimé, que l'on peut aussi décrire comme "Goddamn Idiotic Truckload of sh*t" (Un stupide putain gros tas de merde), selon Linus. +Git... Notre cher Git bien-aimé, que l'on peut aussi décrire comme "Goddamn Idiotic Truckload of sh*t" (Un stupide putain gros tas de m\*rde), selon Linus. Si vous ne connaissez pas encore Git, soyez sûr que vous serez bientôt d'accord avec cette description. -YunoHost et toutes nos applications sont sur la forge Git GitHub. Ce qui veut dire que si vous voulez travailler sur une application, tôt ou tard vous allez devoir faire face à Git. +YunoHost et toutes nos applications sont sur la forge Git GitHub. Ce qui veut dire que si vous voulez travailler sur une application, tôt ou tard vous allez devoir faire face à Git. Alors voyons comment travailler avec Git pour pouvoir contribuer dans le contexte de YunoHost. ## Travailler avec GitHub @@ -14,59 +14,59 @@ Commençons par la partie facile, GitHub est livré avec une interface web "faci #### Branches -Ensuite, et c'est probablement l'une des choses les plus importantes, **ne travaillez pas directement sur la branche master**. +Ensuite, et c'est probablement l'une des choses les plus importantes, **ne travaillez pas directement sur la branche master**. Désolé, il fallait que ce soit dit ! Les branches sont, comme l'explique GitHub, "*une version parallèle d'un dépôt. Elle est contenue dans le dépôt, mais n'affecte pas les autres branches. Elle vous permet de travailler librement sans perturber la version "live".*" -La branche master est la branche qui contient la version de l'application que les utilisateurs installeront et utiliseront effectivement. +La branche master est la branche qui contient la version de l'application que les utilisateurs installeront et utiliseront effectivement. La bonne habitude à prendre est de travailler à partir de la branche testing, et lorsque tout est réglé et testé, vous pouvez fusionner la branche testing dans master, afin que les utilisateurs puissent profiter de la nouvelle version de votre package. -Pour voir et modifier la branche actuelle, utilisez ce bouton : +Pour voir et modifier la branche actuelle, utilisez ce bouton : #### Modifier un fichier Maintenant que vous êtes sur la bonne branche, voyons comment éditer un fichier sur GitHub. -Vous pouvez éditer n'importe quel fichier en utilisant l'icône du petit crayon : +Vous pouvez éditer n'importe quel fichier en utilisant l'icône du petit crayon : -Si vous n'avez pas la permission d'écrire sur le dépôt, vous verrez (comme sur l'image) que vous allez créer un fork (nous verrons plus loin ce qu'est un fork). +Si vous n'avez pas la permission d'écrire sur le dépôt, vous verrez (comme sur l'image) que vous allez créer un fork (nous verrons plus loin ce qu'est un fork). Si vous avez la permission d'écrire, vous allez simplement modifier le fichier, sans forker. #### Validez vos modifications -Lorsque vous avez fini de modifier le fichier, vous pouvez faire un commit de vos modifications. -Derrière ce mot, l'idée est assez simple, vous allez juste enregistrer vos modifications... +Lorsque vous avez fini de modifier le fichier, vous pouvez faire un commit de vos modifications. +Derrière ce mot, l'idée est assez simple, vous allez juste enregistrer vos modifications... -Le premier champ est le nom de votre commit, une phrase très courte pour expliquer pourquoi vous avez fait cette modification. +Le premier champ est le nom de votre commit, une phrase très courte pour expliquer pourquoi vous avez fait cette modification. Le deuxième champ est un champ plus grand pour une explication plus complète, si vous en avez besoin. -Enfin, si vous modifiez un dépôt sur lequel vous avez la permission d'écrire, vous pouvez soit faire un commit directement sur la branche en cours, soit créer une nouvelle branche. +Enfin, si vous modifiez un dépôt sur lequel vous avez la permission d'écrire, vous pouvez soit faire un commit directement sur la branche en cours, soit créer une nouvelle branche. Il est généralement préférable de créer une nouvelle branche, de cette façon vous gardez vos modifications sur une version *parallèle* du dépôt. Vos modifications seront discutées dans une pull request (expliquée ci-dessous) puis finalement fusionnées dans la branche d'origine. #### Forker ou ne pas forker -Un fork est une copie d'un dépôt sur votre propre compte. -Nous avons déjà vu que si vous n'avez pas l'autorisation d'écrire dans un dépôt, la modification d'un fichier créera automatiquement un fork. -Comme le fork est sur votre compte, vous avez toujours la permission d'écrire dessus. +Un fork est une copie d'un dépôt sur votre propre compte. +Nous avons déjà vu que si vous n'avez pas l'autorisation d'écrire dans un dépôt, la modification d'un fichier créera automatiquement un fork. +Comme le fork est sur votre compte, vous avez toujours la permission d'écrire dessus. Mais même si un fork n'est pas le véritable dépôt, mais juste une copie, un fork est toujours lié à son parent. Nous verrons plus tard que la création d'un fork est vraiment utile lors de l'ouverture d'une pull request. -Lorsque vous créez un nouveau package, il est courant d'utiliser l'[application exemple](https://github.com/YunoHost/example_ynh) comme base. -Mais, comme vous ne voulez pas garder ce lien vers l'application d'exemple, vous ne devez pas forker l'application d'exemple. Vous la clonerez plutôt. +Lorsque vous créez un nouveau package, il est courant d'utiliser l'[application exemple](https://github.com/YunoHost/example_ynh) comme base. +Mais, comme vous ne voulez pas garder ce lien vers l'application d'exemple, vous ne devez pas forker l'application d'exemple. Vous la clonerez plutôt. Malheureusement, cloner une application est un peu plus compliqué sur GitHub. Nous verrons plus tard comment cloner vers un dépôt local à la place. -Nous avons vu comment éditer un fichier, et comment cela peut forker l'application. -Mais, lorsque vous voulez éditer plusieurs fichiers, l'interface GitHub n'est pas vraiment la meilleure solution. Dans une telle situation, vous préférerez cloner le dépôt et travailler sur un dépôt local. +Nous avons vu comment éditer un fichier, et comment cela peut forker l'application. +Mais, lorsque vous voulez éditer plusieurs fichiers, l'interface GitHub n'est pas vraiment la meilleure solution. Dans une telle situation, vous préférerez cloner le dépôt et travailler sur un dépôt local. Il se peut que vous deviez tout de même forker sur votre propre compte pour pouvoir enregistrer vos modifications si vous n'avez pas les autorisations sur le dépôt distant. #### Pull request -Après avoir effectué vos commits, que ce soit sur une branche ou un fork, vous souhaitez proposer vos modifications pour qu'elles soient intégrées dans le dépôt principal, ou dans la branche d'origine. +Après avoir effectué vos commits, que ce soit sur une branche ou un fork, vous souhaitez proposer vos modifications pour qu'elles soient intégrées dans le dépôt principal, ou dans la branche d'origine. Pour ce faire, vous allez créer une pull request. GitHub vous demande généralement directement si vous souhaitez le faire. -Sinon, vous trouverez le bouton de création d'une pull request juste ici : +Sinon, vous trouverez le bouton de création d'une pull request juste ici : Lors de la création d'une pull request à partir d'un fork, pour faciliter le travail de révision du code, **ne jamais** décocher la case *Allow edits from maintainers*. Cette option permet simplement aux mainteneurs du dépôt d'origine de modifier directement votre travail. @@ -78,24 +78,24 @@ Conformément à la [YEP 1.7](https://github.com/YunoHost/doc/blob/master/packag Tout d'abord, vous devez avoir la permission d'écrire dans l'organisation, pour ce faire, demandez au groupe Apps sur le salon xmpp Apps. Pour transférer votre application sur l'organisation YunoHost-Apps, allez dans votre dépôt et dans l'onglet *Settings*. -En bas de la page, vous trouverez *Transfer ownership*. -Dans le champ *New owner’s GitHub username or organization name*, tapez *YunoHost-Apps*. +En bas de la page, vous trouverez *Transfer ownership*. +Dans le champ *New owner’s GitHub username or organization name*, tapez *YunoHost-Apps*. Votre dépôt sera déplacé dans l'organisation, vous n'avez pas besoin de supprimer le dépôt d'origine. ## Travailler avec Git en local -Comme nous l'avons vu, vous pouvez faire beaucoup de choses directement sur GitHub. +Comme nous l'avons vu, vous pouvez faire beaucoup de choses directement sur GitHub. Mais lorsque vous devez modifier plusieurs fichiers, ou lorsque vous devez travailler sur votre code de votre côté, il est préférable de travailler directement sur votre ordinateur. Avant d'aller dans la partie infernale de Git, voyons 2 façons différentes de commencer à travailler avec Git. #### Premier cas : Créer un nouveau package -Vous avez découvert, choqué, que la merveilleuse application que vous aimez utiliser tous les jours n'a pas encore son package YunoHost. Et parce que vous êtes sympa, vous avez décidé de créer vous-même le package, pour que tout le monde puisse apprécier cette application. +Vous avez découvert, choqué, que la merveilleuse application que vous aimez utiliser tous les jours n'a pas encore son package YunoHost. Et parce que vous êtes sympa, vous avez décidé de créer vous-même le package, pour que tout le monde puisse apprécier cette application. Quelle bonne idée ! -Le mieux est de commencer par l'[application d'exemple](https://github.com/YunoHost/example_ynh). Mais comme nous l'avons déjà expliqué, vous ne voulez pas forker, parce que si vous le faites, vous allez garder ce lien vers l'application d'exemple et c'est vraiment ennuyeux. +Le mieux est de commencer par l'[application d'exemple](https://github.com/YunoHost/example_ynh). Mais comme nous l'avons déjà expliqué, vous ne voulez pas forker, parce que si vous le faites, vous allez garder ce lien vers l'application d'exemple et c'est vraiment ennuyeux. Donc, vous allez le faire différemment. Vous allez cloner ! ##### git clone @@ -112,13 +112,13 @@ git clone est généralement le point de départ de tout travail local avec Git. ##### Mon nouveau package, suite -Dans le contexte d'un nouveau package, vous devrez également créer un dépôt sur GitHub pour y mettre votre package. -Ce qui n'est pas plus compliqué qu'un gros bouton vert *New*. -Ne vous embêtez pas avec des README, .gitignore ou licence. Créez simplement le dépôt lui-même. -vous pouvez maintenant cloner ce nouveau dépôt avec Git. +Dans le contexte d'un nouveau package, vous devrez également créer un dépôt sur GitHub pour y mettre votre package. +Ce qui n'est pas plus compliqué qu'un gros bouton vert *New*. +Ne vous embêtez pas avec des README, .gitignore ou licence. Créez simplement le dépôt lui-même. +vous pouvez maintenant cloner ce nouveau dépôt avec Git. -Vous disposez maintenant de 2 dépôts clonés sur votre ordinateur. +Vous disposez maintenant de 2 dépôts clonés sur votre ordinateur. Copiez tous les fichiers de l'application example_ynh, **excepté le répertoire .git** (vous voulez juste les fichiers eux-mêmes) dans votre nouveau package. *Si vous le souhaitez, vous pouvez supprimer l'application example_ynh. Nous n'en avons plus besoin.* @@ -127,14 +127,14 @@ Vous êtes prêt à travailler sur votre nouveau package ! #### Deuxième cas : Travailler localement sur un dépôt -Vous disposez déjà d'un dépôt, mais ce que vous voulez, c'est travailler localement, de sorte que vous puissiez modifier plusieurs fichiers. +Vous disposez déjà d'un dépôt, mais ce que vous voulez, c'est travailler localement, de sorte que vous puissiez modifier plusieurs fichiers. Il vous suffit de cloner le dépôt, le répertoire .git est le lien vers le dépôt distant. Rien d'autre à faire qu'un `git clone`. #### Branches Vous avez bien votre copie local du dépôt, mais comme vous avez lu attentivement cette documentation jusque-là, vous savez que vous devez vous assurer d'être sur la branche testing avant de commencer à travailler. -Pour voir les branches, et savoir sur quelle branche vous êtes réellement, alors que vous êtes dans le répertoire de votre dépôt, tapez `git branch`. +Pour voir les branches, et savoir sur quelle branche vous êtes réellement, alors que vous êtes dans le répertoire de votre dépôt, tapez `git branch`. La branche courante est mise en évidence et précédée d'un "*". #### git checkout @@ -147,16 +147,16 @@ git checkout testing #### git pull avant tout -Vous êtes enfin dans la bonne branche, et prêt à travailler. -**Attendez ! Un vilain piège vous attend...** +Vous êtes enfin dans la bonne branche, et prêt à travailler. +**Attendez ! Un vilain piège vous attend...** Avant de vous retrouver dans une situation inextricable. Commencez par un `git pull` pour mettre à jour votre branche avec les derniers changements du dépôt distant. -*Parfois, vous rencontrerez une situation impossible où Git vous dira que vous ne pouvez pas pull parce que vous avez des changements locaux. Mais vous ne vous souciez pas de ces modifications locales, vous voulez juste obtenir la dernière version de la branche distante. Mais Git ne se soucie pas de ce que VOUS voulez...* +*Parfois, vous rencontrerez une situation impossible où Git vous dira que vous ne pouvez pas pull parce que vous avez des changements locaux. Mais vous ne vous souciez pas de ces modifications locales, vous voulez juste obtenir la dernière version de la branche distante. Mais Git ne se soucie pas de ce que VOUS voulez...* *Je dois admettre que ma seule solution est aussi efficace que sale... Un bon vieux `rm -r` du dépôt et un `git clone`* #### Il est temps de travailler -Vous pouvez finalement travailler sur votre code. +Vous pouvez finalement travailler sur votre code. Lorsque vous êtes enfin d'accord avec ce que vous avez fait, il est temps de valider votre travail. La première étape consiste à informer Git sur le(s) fichier(s) à valider. Pour ce faire, nous utiliserons `git add`. @@ -169,21 +169,21 @@ Si vous souhaitez valider l'ensemble de votre travail, vous pouvez aussi simplem git add --all ``` -Pour vérifier l'état actuel de votre validation, vous pouvez utiliser `git status`. Il vous montrera quels fichiers seront inclus dans votre commit, et quels fichiers sont modifiés, mais pas encore inclus. +Pour vérifier l'état actuel de votre validation, vous pouvez utiliser `git status`. Il vous montrera quels fichiers seront inclus dans votre commit, et quels fichiers sont modifiés, mais pas encore inclus. `git status -v` vous indiquera également quelle partie des fichiers est modifiée. Une bonne façon de s'assurer que vous n'avez pas fait d'erreur avant de faire un commit. #### git checkout -b -Avant de faire un commit, ou après, ou avant de commencer à travailler. Quand vous en avez envie ! +Avant de faire un commit, ou après, ou avant de commencer à travailler. Quand vous en avez envie ! Vous devriez envisager d'ajouter votre travail à une branche séparée, de cette façon, il sera facile de créer une pull request dans la branche testing et de discuter avec les autres packagers de ce que vous suggérez de changer. Pour créer une nouvelle branche et passer à cette branche, vous pouvez utiliser `git checkout -b my_new_branch`. #### Commit -Faire un commit, c'est simplement valider son travail dans Git. Comme vous pouvez le faire dans GitHub. -Pour avoir les mêmes champs que vous aviez sur GitHub, avec le nom du commit, et une explication plus longue. Vous pouvez simplement utiliser `git commit`. -La première ligne, avant les commentaires, est pour le nom du commit. +Faire un commit, c'est simplement valider son travail dans Git. Comme vous pouvez le faire dans GitHub. +Pour avoir les mêmes champs que vous aviez sur GitHub, avec le nom du commit, et une explication plus longue. Vous pouvez simplement utiliser `git commit`. +La première ligne, avant les commentaires, est pour le nom du commit. Après tous les commentaires, vous pouvez ajouter une explication si vous le souhaitez. Si vous voulez faire un commit avec seulement un nom pour votre commit, vous pouvez utiliser une simple commande : @@ -193,7 +193,7 @@ git commit -m "My commit name" #### Push vers le dépôt distant -Vos modifications sont validées, mais uniquement sur votre clone local du dépôt. Maintenant, vous devez renvoyer ces modifications sur le dépôt distant sur GitHub. +Vos modifications sont validées, mais uniquement sur votre clone local du dépôt. Maintenant, vous devez renvoyer ces modifications sur le dépôt distant sur GitHub. Pour ce faire, vous devez savoir quelle est votre branche actuelle. (Si vous ne le savez pas, `git branch` vous donnera cette information). Ensuite, vous pouvez git push ```bash From ff4901d6022a638273f3bab2a9787e3d35621805 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Wed, 8 Apr 2020 13:21:12 +0200 Subject: [PATCH 10/10] Update packaging_apps_git_fr.md --- packaging_apps_git_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging_apps_git_fr.md b/packaging_apps_git_fr.md index 2cc085ad..95172258 100644 --- a/packaging_apps_git_fr.md +++ b/packaging_apps_git_fr.md @@ -77,7 +77,7 @@ Conformément à la [YEP 1.7](https://github.com/YunoHost/doc/blob/master/packag Tout d'abord, vous devez avoir la permission d'écrire dans l'organisation, pour ce faire, demandez au groupe Apps sur le salon xmpp Apps. -Pour transférer votre application sur l'organisation YunoHost-Apps, allez dans votre dépôt et dans l'onglet *Settings*. +Pour transférer votre application sur l'organisation YunoHost-Apps, allez dans votre dépôt et dans l'onglet *Settings*. En bas de la page, vous trouverez *Transfer ownership*. Dans le champ *New owner’s GitHub username or organization name*, tapez *YunoHost-Apps*. Votre dépôt sera déplacé dans l'organisation, vous n'avez pas besoin de supprimer le dépôt d'origine.