User Tools

Site Tools


git

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
git [2023/01/30 00:20] – [Limit scope of huge repos] dblumegit [2025/07/08 16:13] (current) – [Building Git] dblume
Line 1: Line 1:
 ====== git ====== ====== git ======
  
-Make the clone at the remote repository.+===== Building Git ===== 
 + 
 +In Ubuntu, get some dev libs first: 
 + 
 +<code bash> 
 +sudo apt-get install libssl-dev libcurl4-gnutls-dev gettext 
 +</code> 
 +There was [[https://lore.kernel.org/git/xmqq5xg2wrd1.fsf@gitster.g/|a security fix in 2.50.1]], so here we get that one: 
 +<code bash> 
 +git clone --filter=blob:none -b v2.50.1 --single-branch --no-tags https://github.com/git/git 
 +# or: git clone --branch v2.50.1 --depth 1 https://github.com/git/git 
 +# or even: wget https://www.kernel.org/pub/software/scm/git/git-2.50.1.tar.xz 
 + 
 +make prefix=$HOME/.local -j$(nproc) 
 +make prefix=$HOME/.local install 
 +</code> 
 + 
 +This will put git in ''$HOME/.local/bin/'' 
 + 
 +===== Using Git ===== 
 + 
 +Make the clone of the remote repository.
  
 <code> <code>
Line 10: Line 31:
 git remote add upstream git://github.com/icambridge/get-shit-done git remote add upstream git://github.com/icambridge/get-shit-done
 </code> </code>
 +
 +If it's a huge repo, [[https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/|consider blobless and single branch and no tags]], like so...
 +
 +<code>
 +git clone \
 +  --filter=blob:none \
 +  -b main \
 +  --single-branch \
 +  --no-tags \
 +  --shallow-submodules \
 +  --recurse-submodules=os/components/toolchain \
 +  --recurse-submodules=':(exclude)**/porting_kit:' \
 +  git@fake.github.com:project/project.git
 +</code>
 +
 +Eventually, if you want to add another branch to a single-branch clone:
 +
 +  git remote set-branches --add origin another-branch
 +
 +Or to de-single-branch-ize a clone:
 +
 +  git remote set-branches origin "*"
 +
  
 ===== Creating a new remote repository from an existing local one ===== ===== Creating a new remote repository from an existing local one =====
Line 54: Line 98:
   $ git push --set-upstream origin new_branch   $ git push --set-upstream origin new_branch
  
 +==== Creating a local branch from an existing remote ====
 +
 +After doing a fetch, and suppose "origin/remote-branch" exists, then just:
 +
 +  $ git switch remote-branch
 ==== Changing a local branch to a new remote branch ==== ==== Changing a local branch to a new remote branch ====
  
Line 96: Line 145:
 git switch main git switch main
 git branch -d bugfix/JIRA-1-new-bugfix git branch -d bugfix/JIRA-1-new-bugfix
 +git pull
 +</code>
 +
 +====== Resolving a Merge Conflict ======
 +
 +<code>
 +git mergetool (possibly with filename)  # Bring up the vim 3-way diff
 +
 +# +----------+-----------+------------------+
 +# | (others) | (common)  | (my most recent) |
 +# | LOCAL    | BASE      | REMOTE           |
 +# +-----------------------------------------+
 +# |                                         |
 +# | temp file with <<< ||| >>> diffs        |
 +# +-----------------------------------------+
 +
 +git commit -a -m "Resolved merge conflict"
 +</code>
 +
 +Possibly keep rebasing.
 +<code>
 +git rebase --continue
 git pull git pull
 </code> </code>
Line 122: Line 193:
 <code bash> <code bash>
 git pull --rebase  # --dry-run to test first git pull --rebase  # --dry-run to test first
 +</code>
 +
 +====== Applying changes in a stash to a changed file =====
 +
 +When ''git stash apply'' doesn't work: Show the stash changes and pipe that to patch. Now you have a patch you can apply.
 +
 +<code>
 +git stash show -p | patch -p0
 </code> </code>
  
Line 152: Line 231:
 git$ cd testcode.git/ git$ cd testcode.git/
 testcode.git$ git init --bare testcode.git$ git init --bare
 +testcode.git$ git config pack.threads 8  # Otherwise clone might fail with "unable to create thread"
 </code> </code>
  
Line 166: Line 246:
 </code> </code>
  
-could've used gitweb but I used GitHub-like [[https://github.com/klaussilveira/gitlist|gitlist]] at http://git.dlma.com.+Options are: 
 + 
 +  * chose GitHub-like [[https://github.com/klaussilveira/gitlist|gitlist]] for https://git.dlma.com, because it works on my shared server. 
 +  * [[https://www.reddit.com/r/selfhosted/comments/13hxnf4/selfhosted_git_services_you_dont_need_a_huge/|cgit]] might work 
 +  * [[https://gogs.io/|gogs]] 
 +  * [[https://git-scm.com/book/en/v2/Git-on-the-Server-GitWeb|GitWeb]] (the one built-in.
  
 ====== Limit scope of huge repos ====== ====== Limit scope of huge repos ======
Line 186: Line 272:
  
 The submodule one is an optimization for the more general: The submodule one is an optimization for the more general:
 +<code bash>
 +git submodule update --recursive  # Add --init before --recursive on first time
 +</code>
 +
 +====== Submodules ======
 +
 +[[https://www.cyberdemon.org/2024/03/20/submodules.html|Demystifying git submodules]] is [[https://social.jvns.ca/@b0rk/112604915327918216|summarized by Julia Evans in a 'zine page here]].
 +
 +Cloning a repo doesn't download its submodules. After cloning, run:
 +
 +<code bash>
 +git submodule update --init --recursive
 +</code>
 +
 +Git pull and checkout don't update submodules. To actually update them, you have to run the following every time you switch branches or pull.
 +
 <code bash> <code bash>
 git submodule update --recursive  # Add --init before --recursive on first time git submodule update --recursive  # Add --init before --recursive on first time
git.1675066815.txt.gz · Last modified: 2023/04/12 20:44 (external edit)