about summary refs log tree commit diff stats
path: root/subx/066print-byte.subx
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2019-05-04 15:00:01 -0700
committerKartik Agaram <vc@akkartik.com>2019-05-04 15:00:01 -0700
commit45bef6b9e952beb8908fd971e7f81c26430a8fa9 (patch)
tree1740707b0cf943c3d304e8ae8358f7860b368513 /subx/066print-byte.subx
parentd36c42fa3ff4d6f2f4282bde3c586c67fdacda46 (diff)
downloadmu-45bef6b9e952beb8908fd971e7f81c26430a8fa9.tar.gz
5145
Diffstat (limited to 'subx/066print-byte.subx')
0 files changed, 0 insertions, 0 deletions
n119' href='#n119'>119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
<!DOCTYPE html>
<html dir="ltr" lang="en">
    <head>
    <meta charset='utf-8'>
    <title>Git</title>
</head>
<body>

    <a href="../index.html">Development Index</a>
    <h1>Git</h1>

    <p>First configure your global identity, configuration
    file resides on ~/.gitconfig ;</p>

    <pre>
       $ git config --global user.name "User Name"
       $ git config --global user.email user@devbox
    </pre>

    <p>If you want to disable pager / paging you can set globally;</p>

    <pre>
    $ git config --global core.pager cat
    </pre>

    <p>Paging based on output size with less;</p>

    <pre>
    git config --global --replace-all core.pager "less -F -X"
    </pre>

    <p>Example to disable for just one subcommand and local repository;</p>

    <pre>
    $ git config pager.diff cat
    </pre>

    <p>Assumptions of this document;</p>

    <ul>
        <li>Correct
            <a href="../tools/gitolite.html#adminusers">user account</a>
            exists on git server or is public readable.
        </li>
        <li>Repository exists or
            <a href="../tools/gitolite.html#adminrep">create one</a>
            if you have permissions. This document uses atom as example.
        </li>
        <li>Correct
            <a href="../tools/openssh.html#sshid">ssh identities</a>,
            and profile alias have been setup. This document uses devbox as example.
        </li>
    </ul>

    <pre>
       $ git clone devbox:atom
       $ git remote -v
    </pre>

    <h2 id="teamwork">1. Team WorkFlow</h2>

    <p>This work flow is based on
    <a href="http://nvie.com/posts/a-successful-git-branching-model/">Vicent Driessen</a>
    development model, it defines rules how branches are forked,
    merged and tagged. By having well defined set of branches,
    the project structure is used as a communication tool,
    allowing to work simultaneously on different stages
    of the development.</p>

    <p>Main Branches;</p>

    <pre>
    ___A___________AB_____ Master
        \___B_____/ \____  Develop

    </pre>

    <dl>
        <dt>master</dt>
        <dd>Current official stable release history.</dd>
        <dt>develop</dt>
        <dd>Integration branch for features.</dd>
    </dl>

    <p>Add-on Branches;</p>

    <pre>
    _A_________________AFR___________________AFRHR Master
     \            _AFR_/   \        _AFRHR_/\      Release
      \          /          \_AFRH_/         \     Hotfix
       \________/_____________________________\__  Develop
         \_F_/     \_F1_/                          Feature

    </pre>

    <dl>
        <dt>feature (f-)</dt>
        <dd>New features, improvement proposal, tests, etc...</dd>
        <dd>Only fork and merge from/to develop.
        <dt>release (r-)</dt>
        <dd>Next release, new features not allowed.</dd>
        <dd>Fork from develop, merges to master and develop.</dd>
        <dt>hotfix (h-)</dt>
        <dd>Hotfix only contain isolated bugfixes.</dd>
        <dd>Only fork from master, merges back to master and develop.</dd>
    </dl>

    <p>
    <h3 id="feature">1.1. Feature</h3>

    <p>Create a branch featurex from develop and checkout;</p>

    <pre>
    $ git checkout -b featurex develop
    </pre>

    <p>Push new branch to server</p>

    <pre>
    $ git push -u origin featurex
    </pre>

    <p>Rename a branch, if all feature branches start by "f-" is easy
    and quick to type and easy to spot;</p>

    <pre>
    $ git branch -m featurex f-xpto
    </pre>

    <p>Rename remote branch;</p>

    <pre>
    $ git push origin :featurex f-xpto
    $ git push origin -u f-xpto
    </pre>

    <p>Merge branch feature into develop;</p>

    <pre>
    $ git checkout develop
    Switched to branch 'develop'
    $ git merge --no-ff f-xpto
    Updating ea1b82a..05e9557
    (Summary of changes)
    $ git push origin develop
    </pre>

    <p>Delete Local;</p>

    <pre>
    $ git branch -D f-xpto
    </pre>

    <p>Delete Remote</p>

    <pre>
    $ git push origin :f-xpto
    </pre>

    <h3 id="release">1.2. Release</h3>

    <p>Software release numbers follow <a href="http://semver.org/">Tom Preston-Werner</a>
    description;</p>

    <pre>
    software-name-X.Y.Z.tar.xz
    </pre>

    <dl>
        <dt>X</dt>
        <dd>Major version, backwards incompatible API changes.</dd>
        <dt>Y</dt>
        <dd>Minor version, backwards-compatible changes.</dd>
        <dt>Z</dt>
        <dd>Patch version, backwards-compatible bug fixes.</dd>
    </dl>

    <pre>
    $ git checkout -b r-1.2.1 develop
    Switched to a new branch "release-1.2.1"
    $ ./bump-version.sh 1.2.1
    Files modified successfully, version bumped to 1.2.1.
    $ git commit -a -m "Bumped version number to 1.2.1"
    [release-1.2 74d9424] Bumped version number to 1.2.1
    1 files changed, 1 insertions(+), 1 deletions(-)
    </pre>

    <p>Only documentation or bugfixes are allowed in this
    branch. When release is ready for production merge
    and push to master;</p>

    <pre>
    $ git checkout master
    Switched to branch 'master'
    $ git merge --no-ff r-1.2.1
    Merge made by recursive.
    </pre>

    <p>Tag new release with software-name-version, this
    allows meaningful ports
    <a href="../core/ports.html">distfiles</a> when
    downloading releases from git archives;</p>

    <pre>
    $ git tag -a software-name-1.2.1
    $ git push --follow-tags
    </pre>

    <p>Update branch develop with bugfixes from last release,
    conflict will happen in next step</p>

    <pre>
    $ git checkout develop
    Switched to branch 'develop'
    $ git merge --no-ff r-1.2.1
    Merge made by recursive.
    (Summary of changes)
    $ git push
    </pre>

    <h3 id="tags">1.3. Tags</h3>

    <p>There are two main types of tags, lightweight and
    annotated. Lightweight tag is a pointer to a specific commit,
    much like cheap branches. Annotated tags are stored as full objects
    and allow to sign with <a href="gnupg.html">gnupg</a>, making it ideal
    for distributing releases.</p>

    <p>Delete local and remote last end of life version;</p>

    <pre>
    $ git tag -d software-name-0.0.12
    $ git push origin :refs/tags/software-name-0.8
    </pre>

    <p>Checkout master commit you want to start long term support and then;</p>

    <pre>
    $ git tag -m "this commit is tagged" -a "software-name-1.1.8"
    $ git push --follow-tags
    </pre>

    <h3 id="hotfix">1.4. Hotfix</h3>

    <p>This branch should never exist, ;)</p>

    <pre>
    $ git checkout -b h-1.2.2 master
    $ ./bump-version.sh 1.2.2
    Files modified successfully, version bumped to 1.2.2
    $ git commit -a -m "Bumped version number to 1.2.2"
    </pre>

    <pre>
    $ git merge --no-ff b-error-xpto
    ...
    $ git merge --no-ff b-error-xpto
    ...
    $ git commit -m "Commit severe fix"
    ...
    $ git commit -m "Commit severe fix"
    ...
    </pre>

    <pre>
    $ git checkout master
    Switched to branch 'master'
    $ git merge --no-ff h-1.2.2
    Merge made by recursive.
    (Summary of changes)
    $ git tag -a software-name-1.2.2
    </pre>

    <p>Conflict will happen in next step</p>

    <pre>
    $ git checkout develop
    Switched to branch 'develop'
    $ git merge --no-ff h-1.2.2
    Merge made by recursive.
    (Summary of changes)
    </pre>

    <pre>
    $ git -D h-1.2.2
    </pre>

    <h2 id="local">2. Local Workflow</h2>

    <h3 id="working">2.1. Working area</h3>

    <p>Mark all deleted to commit;</p>

    <pre>
    $ git ls-files --deleted -z | xargs -0 git rm
    </pre>

    <p>Query last commit that affected current file path</p>

    <pre>
    $ git rev-list -n 1 HEAD -- .
    $ git show f000 path/to/file
    $ git diff --name-status f000 path/to/file
    </pre>

    <p>Undo a file to specific commit</p>

    <pre>
    $ git checkout f000^ -- path/to/file
    </pre>

    <p>Join multiple commits into single one;</p>

    <pre>
    $ git log --oneline
    $ git rebase -i oldest_commit_to_rewrite
    </pre>

    <h3 id="logdiff">2.2. Logs, diff commits</h3>

    <p>Create patch files to target branch/tag/ref;</p>

    <pre>
    $ git format-patch --no-prefix software-v0.0.1
    </pre>

    <p>Same using diff command;</p>

    <pre>
    $ diff orig file > file.patch
    </pre>

    <h3 id="remote">2.3. Working with remotes</h3>

    <p>Adding a new remote;</p>

    <pre>
    $ git remote add newremotename https://machine.example.org/repo.git
    </pre>

    <p>Update all branches with remote;</p>

    <pre>
    $ git fetch --all
    $ git pull --all
    </pre>

    <p>If you want to track all remotes run this line
    and then the commands mentioned above;</p>

    <pre>
    $ for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done
    </pre>

    <p>Future updates;</p>

    <pre>
    $ git fetch --all
    $ git pull --all
    </pre>

    <p>Update local branches removed on remote set;</p>

    <pre>
    $ git config --global fetch.prune true
    </pre>

    <p>This will prune on fetch or you can keep it manually;</p>

    <pre>
    $ git remote prune origin
    </pre>

    <a href="../index.html">Development Index</a>
    <p>This is part of the Hive System Documentation.
    Copyright (C) 2018
    Hive Team.
    See the file <a href="../../fdl-1.3-standalone.html">Gnu Free Documentation License</a>
    for copying conditions.</p>
</body>
</html>