📖 Scenario: You are working on a team project using Git. To keep the code quality high, you want to run tests automatically before pushing any changes to the remote repository.This will help catch errors early and avoid broken code being shared.
🎯 Goal: Build a Git pre-push hook script that runs a test command before allowing a push.If the tests fail, the push should be stopped.
📋 What You'll Learn
Create a pre-push hook file in the .git/hooks directory
Make the hook file executable
Add a test command inside the hook script
Ensure the push is blocked if tests fail
💡 Why This Matters
🌍 Real World
Pre-push hooks help teams catch errors early by running tests automatically before code is shared.
💼 Career
Knowing how to write Git hooks is useful for DevOps roles and software developers to enforce quality checks.
Progress0 / 4 steps
1
Create the pre-push hook file
Create a file named pre-push inside the .git/hooks directory with the first line #!/bin/sh to specify the shell interpreter.
Git
Hint
The first line of a shell script should be #!/bin/sh to tell Git which shell to use.
2
Add a test command variable
Inside the pre-push file, add a variable named TEST_COMMAND and set it to npm test.
Git
Hint
Use TEST_COMMAND="npm test" to store the test command in a variable.
3
Run the test command and check result
Add code to run the $TEST_COMMAND and check if it succeeds. If it fails, print Tests failed, push aborted. and exit with status 1.
Git
Hint
Use if ! $TEST_COMMAND; then ... fi to run the tests and handle failure.
4
Print success message after tests pass
Add a line to print Tests passed, pushing changes... after the tests succeed.
Git
Hint
Use echo "Tests passed, pushing changes..." to show the success message.
Practice
(1/5)
1. What is the main purpose of a pre-push hook in Git?
easy
A. To delete local branches after pushing
B. To merge branches automatically before pushing
C. To run checks or tests before code is pushed to a remote repository
D. To create a backup of the repository before pushing
Solution
Step 1: Understand the role of pre-push hooks
Pre-push hooks run scripts before pushing code to a remote repository to catch errors early.
Step 2: Identify the correct purpose
They help ensure code quality by running tests or checks before the push happens.
Final Answer:
To run checks or tests before code is pushed to a remote repository -> Option C
Quick Check:
Pre-push hook = run checks before push [OK]
Hint: Pre-push hooks run before push to catch problems early [OK]
Common Mistakes:
Confusing pre-push with post-push hooks
Thinking it merges branches automatically
Assuming it deletes branches
2. Which of the following is the correct way to make a pre-push hook script executable on Linux or macOS?
easy
A. chmod +x .git/hooks/pre-push
B. git enable pre-push
C. chmod 777 .git/hooks/pre-push
D. git hook activate pre-push
Solution
Step 1: Identify how to make scripts executable
On Linux/macOS, chmod +x sets execute permission on a file.
Step 2: Apply to pre-push hook
Running chmod +x .git/hooks/pre-push makes the hook script runnable by Git.
Final Answer:
chmod +x .git/hooks/pre-push -> Option A
Quick Check:
Make hook executable = chmod +x [OK]
Hint: Use chmod +x to make hook scripts executable [OK]
Common Mistakes:
Using git commands that don't exist for hooks
Setting overly permissive permissions like 777
Forgetting to make the script executable
3. Given this pre-push hook script snippet, what will happen if the tests fail?
#!/bin/sh
npm test || exit 1
medium
A. The push will continue regardless of test results
B. The script will delete the remote branch
C. The tests will be skipped
D. The push will be blocked and stopped
Solution
Step 1: Understand the script logic
The script runs npm test. If tests fail, npm test returns non-zero, triggering exit 1.
Step 2: Effect of exit 1 in pre-push hook
Exiting with a non-zero code stops the push process, blocking the push.
Final Answer:
The push will be blocked and stopped -> Option D
Quick Check:
Exit 1 in pre-push = block push [OK]
Hint: Exit non-zero in pre-push stops the push [OK]
Common Mistakes:
Assuming push continues even if tests fail
Thinking tests are skipped automatically
Confusing exit codes with success
4. You wrote a pre-push hook script but it does not run when you push. What is the most likely cause?
medium
A. The remote repository is down
B. The script is missing execute permissions
C. You forgot to commit your changes
D. The branch name is incorrect
Solution
Step 1: Check script execution requirements
Git requires hook scripts to have execute permission to run them.
Step 2: Identify common cause of hook not running
If the script lacks execute permission, Git silently skips running it.
Final Answer:
The script is missing execute permissions -> Option B
Quick Check:
Missing execute permission = hook won't run [OK]
Hint: Check execute permission if hook doesn't run [OK]
Common Mistakes:
Blaming remote repository for local hook issues
Thinking commit status affects hook execution
Assuming branch name affects hook running
5. You want your pre-push hook to run tests only on files changed in the last commit before pushing. Which approach is best?
hard
A. Use git diff --name-only HEAD~1 HEAD inside the hook to get changed files and run tests accordingly
B. Run tests on all files every time without checking changes
C. Manually list files in the hook script each time
D. Push first, then run tests on the remote repository
Solution
Step 1: Identify how to detect changed files
The command git diff --name-only HEAD~1 HEAD lists files changed in the last commit.
Step 2: Use this command in pre-push hook
Using this inside the hook lets you run tests only on changed files, saving time and resources.
Final Answer:
Use git diff --name-only HEAD~1 HEAD inside the hook to get changed files and run tests accordingly -> Option A
Quick Check:
Detect changed files with git diff for selective tests [OK]
Hint: Use git diff to find changed files for selective tests [OK]
Common Mistakes:
Running tests on all files unnecessarily
Manually updating file lists each time
Running tests after push instead of before
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.