From 4a352f89efc6f06e1bd6e37fea2d5b3ee9765483 Mon Sep 17 00:00:00 2001 From: Malin Freeborn Date: Mon, 20 Apr 2026 05:33:50 +0200 Subject: [PATCH] git cleanup --- data/{backups => }/archives.md | 30 +---- data/git.md | 131 +++++++++++++++++++++ data/git/basics.md | 202 --------------------------------- data/git/cleanup.md | 19 ++++ data/git/commit_for_another.md | 1 + data/git/git_secret.md | 2 +- data/git/hooks.md | 6 +- data/git/subtree.md | 34 ------ data/{backups => }/unison.md | 0 9 files changed, 160 insertions(+), 265 deletions(-) rename data/{backups => }/archives.md (65%) create mode 100644 data/git.md delete mode 100644 data/git/basics.md create mode 100644 data/git/cleanup.md delete mode 100644 data/git/subtree.md rename data/{backups => }/unison.md (100%) diff --git a/data/backups/archives.md b/data/archives.md similarity index 65% rename from data/backups/archives.md rename to data/archives.md index 96c3c57..523c4b3 100644 --- a/data/backups/archives.md +++ b/data/archives.md @@ -1,10 +1,9 @@ --- title: "Archives" -tags: [ "tar", "backups", ".tgz", "tar.gz" ] +tags: [ "archives", "backups" ] --- -# `tar` -## Create +# Create Combine many files and directories into a single t-archive file. @@ -35,7 +34,7 @@ files=$(ls /etc/nginx) tar cf "$ARCHIVE".tar -C /etc/nginx/ $file ``` -## Extract +# Extract Extract the tar archive with @@ -45,7 +44,7 @@ tar xf "$ARCHIVE".tar You can remember this with the mnemonic 'e*X*tract *F*ile'. -## Compress +# Compress Create a zip-compressed archive with the `z` flag. @@ -55,24 +54,3 @@ tar czf "$ARCHIVE".tgz -C /etc/nginx/ $file You can use any file ending you want, but sane people like to use '.tgz' or '.tar.tgz'. -# 7zip - -(also called 'p7zip' or '7z') - -Make archive: - -```sh -7za a -tzip -p "$PASSWORD" -mem=AES256 $ARCHIVE.zip $FILE_1 $FILE_2 -``` - -Note that people can still see every filename in your archive, and can change those files. -They just can't read the contents. - -Unzip: - -```sh -7za x archive.zip -``` - -7zip will open anything: zip-files, rar-files, a tin of beans, *anything*. -However, the extracted tgz files will just be tar files, so you will still need to use tar to extract them (see above). diff --git a/data/git.md b/data/git.md new file mode 100644 index 0000000..6ca0598 --- /dev/null +++ b/data/git.md @@ -0,0 +1,131 @@ +--- +title: "git" +tags: [ "data", "setup" ] +--- + + +```sh +git config --global user.email "${email}" +``` + +```sh +git config --global user.name "${name}" +``` + +Decide on algorithm: + +- If you're scared of insecure hash-sums, go with `hash=sha256`. +- If you don't know what a hash sum is, go with `hash=sha1`. + +## Init the Git + +Start a git in directory `${DIR}`: + +```sh +git init --object-format=${hash} ${DIR} +cd ${dir}/ +``` + +Make a file explaining what the project does, and tell `git` to track it: + +```sh +echo "I hereby solemnly swear never to commit a binary file." > README.md +git add README.md +``` + +Then make the initial commit, explaining the change you just made: + +```sh +git commit +``` + +# Working + +Once you make a change to some file, add it and make a commit explaining it. + +```sh +git add ${file} +``` + +```sh +git commit -m"change ${file}" +``` + +Check your history: + +```sh +git log +``` + +# Remotes + +If you want to keep a copy on a public site such as Gitlab, so others can see it, then go there and create a blank project (no readme, nothing). +Give it the same name as the `$DIR` directory, above. + +Add this as a remote: + +```sh +remote=gitlab +git remote add ${remote} https://gitlab.com/${username}/${dir} +``` + +Tell git you're pushing the branch 'master' to the remote repo 'origin': + +```sh +git push -u master origin +``` + +Pull down changes that others have made: + +```sh +git pull +``` + +# Branches + +A branch is a full copy of the project to test additional ideas. +You can make a new branch called 'featurez' like this: + +```sh +git branch ${feature_branch} +``` + +Have a look at all your branches: + +```sh +git branch +``` + +Switch to your new branch: + +```sh +git checkout ${feature_branch} +``` + +And if your changes are rubbish, checkout the "master" branch again, then delete "featurez": + +```sh +git branch -D ${feature_branch} +``` + +Or if it's a good branch, push it to the remote: + +```sh +remote=origin +git push $remote ${feature_branch} +``` + +# Merging + +Once you like the feature, merge it into the main branch. Switch to master then merge it: + +```sh +git merge ${feature_branch} +``` + +And delete the branch, as you've already merged it: + +```sh +git branch -d ${feature_branch} +``` + diff --git a/data/git/basics.md b/data/git/basics.md deleted file mode 100644 index 9f9020a..0000000 --- a/data/git/basics.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -title: "git" -tags: [ "data" ] ---- -# Starting - -## New Machines - -```sh -git config --global user.email "$YOUR_EMAIL" -``` - -```sh -git config --global user.name "$YOUR_NAME" -``` - -# New Git - -Decide on algorithm: - -- If you're scared of insecure hash-sums, go with `hash=sha256`. -- If you don't know what a hash sum is, go with `hash=sha1`. - -## Init the Git - -Start a git in directory `${DIR}`: - -```sh -git init --object-format=${hash} ${DIR} -cd ${DIR} -``` - -Make a file explaining what the project does, and tell `git` to track it: - -```sh -echo "I hereby solemnly swear never to commit a binary file." > README.md -git add README.md -``` - -Then make the initial commit, explaining the change you just made: - -```sh -git commit -``` - -# Working - -Once you make a change to some file, add it and make a commit explaining it. - -```sh -git add $FILE -``` - -```sh -git commit -m"change $FILE" -``` - -Check your history: - -```sh -git log -``` - -# Remotes - -If you want to keep a copy on a public site such as Gitlab, so others can see it, then go there and create a blank project (no readme, nothing). -Give it the same name as the `$DIR` directory, above. - -Add this as a remote: - -```sh -REMOTE=gitlab -git remote add $REMOTE https://gitlab.com/$USERNAME/$DIR -``` - -Tell git you're pushing the branch "master" to the remote repo "origin": - -```sh -git push -u master origin -``` - -If someone makes a change on the remote, pull it down with: - -```sh -git pull -``` - -# Branches - -A branch is a full copy of the project to test additional ideas. -You can make a new branch called 'featurez' like this: - -```sh -git branch $FEATURE_BRANCH -``` - -Have a look at all your branches: - -```sh -git branch -``` - -Switch to your new branch: - -```sh -git checkout $FEATURE_BRANCH -``` - -And if your changes are rubbish, checkout the "master" branch again, then delete "featurez": - -```sh -git branch -D $FEATURE_BRANCH -``` - -Or if it's a good branch, push it to the remote: - -```sh -remote=origin -git push $remote $FEATURE_BRANCH -``` - -## Merging - -Once you like the feature, merge it into the main branch. Switch to master then merge it: - -```sh -git merge $FEATURE_BRANCH -``` - -And delete the branch, as you've already merged it: - -```sh -git branch -d $FEATURE_BRANCH -``` - -# Subtree - -## Pulling another git repo into a subtree - -```sh -git subtree add -P config git@gitlab.com:bindrpg/config.git master -``` - -# Tricks - -## Delete All History - -```sh -git checkout --orphan temp -``` - -```sh -git add -A -``` - -```sh -git commit -am "release the commits!" -``` - -```sh -git branch -D master -``` - -```sh -git branch -m master -``` - -```sh -git push -f origin master -``` - -Gitlab requires more changes, such as going to `settings > repository` and switching the main branch, then stripping protection. - -## Clean up Bloated Repo - -```sh -git fsck --full -``` - -```sh -git gc --prune=now --aggressive -``` - -```sh -git repack -``` - -## Find Binary Blobs - -```sh -git rev-list --objects --all \ -| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \ -| sed -n 's/^blob //p' \ -| sort --numeric-sort --key=2 \ -| cut -c 1-12,41- \ -| $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest - -``` - -# More - -For big binary files (like images), see [git large-file-storage](git-lfs.md) diff --git a/data/git/cleanup.md b/data/git/cleanup.md new file mode 100644 index 0000000..9d5f627 --- /dev/null +++ b/data/git/cleanup.md @@ -0,0 +1,19 @@ +--- +title: "Clean up a bloated git repo" +tags: [ "data", "setup" ] +requires: [ "git" ] +--- + + +```sh +git fsck --full +``` + +```sh +git gc --prune=now --aggressive +``` + +```sh +git repack +``` + diff --git a/data/git/commit_for_another.md b/data/git/commit_for_another.md index efa72d4..0db58d3 100644 --- a/data/git/commit_for_another.md +++ b/data/git/commit_for_another.md @@ -1,6 +1,7 @@ --- title: "Commit for Another" tags: [ "data", "git" ] +requires: [ "git" ] --- You can make Alice the author, while you are still the commiter: diff --git a/data/git/git_secret.md b/data/git/git_secret.md index d766867..7b54681 100644 --- a/data/git/git_secret.md +++ b/data/git/git_secret.md @@ -1,6 +1,6 @@ --- title: "git-secret" -tags: [ "data", "git" ] +tags: [ "data", "git", "review" ] --- This utility is largely useless, as it can only identify people by their email. diff --git a/data/git/hooks.md b/data/git/hooks.md index 622c1bf..a69d8b1 100644 --- a/data/git/hooks.md +++ b/data/git/hooks.md @@ -6,7 +6,7 @@ tags: [ "data", "git" ] Check out the sample hooks: ```sh -cd $GIT_REPO +cd ${git_repo} ls .git/hooks head .git/hooks/pre-commit.sample ``` @@ -21,7 +21,9 @@ chmod u+x .git/hooks/commit-msg ## Committing -Your `git hooks` will not enter the repository, but you can commit them to a repository, then request others add these git hooks to their own branch, by putting a note in the project's `README.md`. +The `git hooks` will not work on other people who use the repository, but you +can commit them to a repository, then request others add these git hooks to +their own branch, by putting a note in the project's `README.md`. ```markdown The project comes with recommended git hooks. diff --git a/data/git/subtree.md b/data/git/subtree.md deleted file mode 100644 index 1d34dba..0000000 --- a/data/git/subtree.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: "git subtree" -tags: [ "data", "git", "subtree" ] ---- - -## Pulling a Subtree from an existing git - -The project has subdirectories `sub-1`, `sub-2`, `sub-3`. -The first should be its own repository, but should also retain its own history. - -First, we extract its history as an independent item, and make that into a seprate branch. - -```sh -git subtree split --prefix=sub-1 -b sub -``` - -If you want something a few directories deep, you can use `--prefix=sub-1/dir-2/dir-3 - -Then go and create a new git somewhere else: - -```sh -cd ..;mkdir sub-1;cd sub-1;git init --bare -``` - -Then go back to your initial git repo, and do the following: - -git push ../subtest sub:master - -Finally, you can clone this repo from your original. - -```sh -git clone ../subtest -``` - diff --git a/data/backups/unison.md b/data/unison.md similarity index 100% rename from data/backups/unison.md rename to data/unison.md