- Topics
- Run git commands from outside of a Git repository
- Remove local branches tracking remote branches that no longer present on remotes
- Generate a list of my commits
- Find all files committed by a user
- Remove ignored files from index
- Always push to multiple remote repositories and pull from one logical central repository
- Rename a branch
- References
Topics
Run git commands from outside of a Git repository
git --git-dir=/Users/meng/my-git-repo/.git --work-tree=/Users/meng/my-git-repo/ status
Remove local branches tracking remote branches that no longer present on remotes
git remote prune origin
Generate a list of my commits
git log --all --no-merges --author='XXX' --stat --after='2015-9-1' | grep -v '^Author: '
Remarks:
--allgenerates the result for all branches;--no-mergesignores the merge commits which are often not desirable in a list of additions and revisions one "genuinely authored";--author='XXX'restricts the list to commits from a specific author;--after='2015-9-1'restricts the list to commits made after the specified date, which is often desirable for listing one's recent commits;grep -v '^Author: ': if--author='XXX'is used, the author information for each entry of commit is redundant.
Find all files committed by a user
git log --no-merges --stat --author="PATTERN" --name-only --pretty=format:"" | sort -u
Remarks:
PATTERNis a regex pattern matching the desired user.
Remove ignored files from index
Method 1: git update-index --assume-unchanged
If a file has been added to the index, i.e. the staging area, but it's decided it does not need to be version controlled by Git, but it should also not be deleted from the working tree, remove it from index:
git update-index --assume-unchanged myIgnoredFile
This only removes the myIgnoredFile file from the
index of the current repository, but will not remove it from the
repositories you push to since it only modified the index of the
local repository.
To add it back later,
git update-index --no-assume-unchanged myIgnoredFile
List files that are currently assumed unchanged when computing index:
git ls-files -v | grep "^<span class="createlink">:lower:</span>"
TODO: difference between this method and method 2.
Method 2: git rm --cached
If a file has been added to the index, i.e. the staging area, but it's decided it does not need to be version controlled by Git, remove it from index:
repo/ $ git rm --cached myIgnoredFile
The option --cached limits the removal to the index
only and hence the file myIgnoredFile and any
modification to it in the working tree is left alone.
Method 3: Method 2 recursively
If there are many files that are added to the index but are then
decided to be ignored, and specified by patterns in the
.gitignore file, the index can be cleaned as the
following
Commit changes that's already staged in the index, so files that are already staged but will not need to be ignored later is properly committed:
git commit -a -m "XXX"
Recursively remove everything from the index
git rm -r --cached .
Re-add everything, so the modified .gitignore file
will ensure the ignored files are not added to the index:
git add .
Commit:
git commit -a -m "XXX"
TODO
Always push to multiple remote repositories and pull from one logical central repository
To push to multiple remote repositories automatically everytime
you push, but pull only from one remote repository which might be
logically considered as the "authoratative" central repository,
configure the remote origin as
[remote "origin"]
url = USER@MYHOST.COM:/PATH//TO/CENTRAL-REPO
pushurl = USER@MYHOST.COM:/PATH//TO/CENTRAL-REPO
pushurl = git@gitlab.com:XXXuserXXX/BACKUP-REPO1
pushurl = https://XXXuserXXX@bitbucket.org/XXXuserXXX/BACKUP-REPO2.git
fetch = +refs/heads/*:refs/remotes/origin/*
(The all uppercase parts and the parts sandwiched in between two
XXXs should be adjusted to one's real-world
values.)
-
git pullorgit pull origin masterwill pull fromcentral-repo; -
git pushorgit push origin masterwill push to the logical central repositoryCENTRAL-REPOas well as the other two backup repositories via the push URLsBACKUP-REPO1andBACKUP-REPO2. But if thepushurlfor theCENTRAL-REPOis not explicitly added, it will not be pushed to, i.e. only havingurldoes not suffice. The repositories other than the logical central repository can be used as back-ups or mirrors.
Rename a branch
Rename a branch:
git branch -m <old_branch_name> <new_branch_name>
Or
git checkout <old_branch_name>
git branch -m <new_branch_name>
Remove old branch from the remote origin [1]:
git push origin --delete <old_branch_name>
or [2]:
git push origin :<old_branch_name>
Push the new branch to the remote origin
git push origin -u <new_branch_name>
References
-
Sissel, http://www.semicomplete.com/blog/geekery/ssl-latency.html
-
Ruan, http://www.ruanyifeng.com/blog/2014/09/ssl-latency.html
- git-scm.com, "Deleting Remote Branches," 2016, https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Deleting-Remote-Branches↩
<source>:<destination>specifies the refspec to push from and to. When the<source>is omitted,git push origin :<old_branch_name>indicates it pushes an empty refspec to the remote destination branch<old_branch_name>which effectively deletes it on the remote.↩